在Node.js中require 是用来加载代码的 与之相对的exports和module.exports是用来导出代码的 每一个Node执行文件都会自动创建一个module对象 我们需要知道
- module对象会创建一个叫exports的属性并 初始化为{}
- exports是指向module.exports的引用
- require() 返回的是module.exports
用一个简单的例子来类比module.exports与exports的关系:
|
|
运行结果:
|
|
很容易理解foo是一个对象 bar是指向foo的引用 foo和bar指向同一块内存 所以当bar改变时即内存中的内容发生改变 所以foo也随之改变 随后改变bar的指向bar开始指向另一块内存所以当bar再次改变时 foo就不会改变 所以最终结果不同 与之相对的 另一个例子:
foo.js
|
|
bar.js
|
|
运行bar.js 结果如下:
|
|
改变foo.js 如下:
|
|
再次运行bar.js 结果如下:
|
|
到这里 我们可以很清楚的看到 exports是指向module.exports的引用 在module.exports被改变时exports没变 require() 返回的是module.exports 所以真正执行的是module.exports 所以在bar.js中输出的是3
经常可以看到如下的使用方法:
|
|
它等价于:
|
|
即当module.exports的指向发生改变后 exports会断开与module.exports的引用 让exports=module.exports 可以让exports重新绑定module.exports
另外 module.exports 可以导出整个对象 在外部模块调用时 不能调用对象的私有方法 即prototype创建的方法不能被调用 例如:
foo.js
|
|
bar.js
|
|
结果如下:
|
|