我是看七天学会NodeJS 入的坑. 结果被一同事给问住了. exports和module.exports有啥区别.做为一新手.根本没搞清楚. 一翻测试获得了以下的结论javascript
exports = module.exports
不过别急.里面有好多有意思的东西java
首先.nodejs启动后,会为每一个加载的js文件会产生一个module对象(此处待验证由于没仔细找相关文档,只是目测结果)node
app.js文件代码:git
console.log(module)
输出:github
{ id: '.', exports: {}, parent: null, filename: 'E:\\node\\test\\app.js', loaded: false, children: [], paths: [ 'E:\\node\\test\\node_modules', 'E:\\node\\node_modules', 'E:\\node\\node\\node_modules', 'E:\\node\\node_modules', 'E:\\node_modules' ] }
这是app.js文件输出的module对象, 相信对你们.应该都能猜到里面各个参数的意思.但对新手来讲. exports 确是个深深的坑.
咱们来修改下app.jsapp
var foo = require("./foo");
新建foo.js测试
module.exports.hello = 'bbb' console.log(exports.hello) exports.hello = 'aaa' console.log(module.exports.hello)
输出:ui
bbb aaa
哎哟 咱们操做是同个东西吗. 没错.这就是开篇的那个结论. 但接下来. 有意思的东西. 继续改
app.jsprototype
var foo = require("./foo"); console.log(foo);
foo.jscode
var View = function (){} View.prototype.test = function(){ console.log('test') } View.test1 = function(){ console.log('test1') } exports = View;
我预期它会给我输出View这个function对象 (由于我javascript很矬因此预期错了.) 结果返回了 {}
怎么了?没怎么.理解完全错了呗. 继续改:
app.js
.... console.log(foo.view);
foo.js
.... exports.view = View;
终于正常输出了. 好像明白什么了. require 真正返回的是module的exports属性. 而 单纯foo.js中的exports 只不过是module的exports属性的引用 . 直接对exports赋值.对module是没有任何改变的.固然不会正常输出. 这就完了吗? 没有. 下面算是语法分析了. foo.js再改 我要给我导出的对象用exports加点属性
.... // exports.view = View; module.exports = View; exports = function (argument) { // body... }
结果. 它还真xxx了. 个人xxx属性呢.
{ [Function] test1: [Function] }
唉.此次真的是硬伤问题了. module.exports = View 这不是也改了 module的exports 而 exports仍是指向原来的那个{}
因此foo.js的正确姿式
.... exports = module.exports = View; exports.xxx= function (argument) { // body... }