nodejs学习历程之模块的使用

模块化中,如果直接使用exports去暴漏对象为何没有得到期待值

function Dialog() {
    this.time = 3000
}
Dialog.title = "标题"
Dialog.prototype.$show = function () {
    console.log("show")
}
Dialog.prototype.$hide = function () {
    console.log("hide")
}
// 若直接使用exports进行暴漏则不会获得任何信息
// 而直接给exports赋予属性可以导致exports对象的变化
// exports = Dialog
// exports.xxx = Dialog
module.exports = Dialog
// 被编译之后的效果如下其实不难看出如果我们使用了exports = Dialog
// 那么事实上, module.exports不会发生任何变化,为一个空对象
// (function (exports, module, require) {
//     module.exports = exports = this = {}

//     function Dialog() {
//         this.time = 3000
//     }
//     Dialog.title = "标题"
//     Dialog.prototype.$show = function () {
//         console.log("show")
//     }
//     Dialog.prototype.$hide = function () {
//         console.log("hide")
//     }
//     return module.exports
// })()

看起来很难理解,其实这个就类似, var a = b = {}b.a = 1 时,a等于1,如果我们直接令 b = {a:1} 那么a其实是空的,代入进来即, a为module.exports,b为exports 这样是不是就明白了。

那么如果我们将其转换为es6的写法是什么样的呢?

黑喂狗!

// 先声明一个类
class Dialog {
    // 构造函数部分
    constructor() {
        // 此处则为是私有属性,私有属性则是定义在构造函数的内部
        this.time = 3000
    }
    // 相比es5中,此处为静态属性,直接定义在这个类中但是不知道为什么node似乎不认
    // 浏览器是正常的
    static title = "标题"
    // 原型中的方法,和es5相比无需再书写prototype
    // 如果这里没有向外抛出值的话,则外部运行这个函数之后只会得到一个undefined
    $show() {
        console.log("show")
    }
    $hide() {
        console.log("hide")
    }
}
module.exports = Dialog

如何调用呢

const Dialog = require("./module-es5")
// 由于是构造函数,再调用的时候需要使用new
let fun = new Dialog()
// 尽情使用吧
console.log(fun.$show())

全局挂载

除去使用模块引入的姿势,还有一种不被推荐的引入姿势,就是将需要引用的东西挂载到全局中。例如:

// 这是一个计算数组总和的一个函数
let sum = (...args) => args.reduce((prev, next) => prev + next)
// 挂载全局
global.sum = sum

而需要引用的时候则是,直接 sum(1,2,3,4) 就能够得到结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容