模块化中,如果直接使用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)
就能够得到结果。