今天闲来无事学习下node.js,看到两个有意思的东西,exports和module.exports,不涉及概念,各种教程上写的太详细了,不再拾人牙慧,只是记录自己学习、探索的过程
1、exports和module.exports是什么?
暴力输出一下:
console.log(exports);
console.log(module.exports);
// {}
// {}
竟然是两个空对象。突然灵机一动,这两个空对象会不会是同一个东西?
console.log(exports === module.exports);
// true
我屮艸芔茻,竟然真是同一个对象。
总结:模块内置对象,而且是个空对象。
2、模块导出方式有什么不一样?
创建两个模块试一下
// module.js
function foo() {
console.log("this is foo");
}
// main.js
var my_module = require('./module');
console.log(my_module);
在module.js中分别测试
// 先测试exports
exports.foo = foo; // { foo: [Function: foo] }
exports = foo; // {}
exports = {foo: foo}; // {}
exports.tt = "712"; // { tt: '712' }
// 再测试module.exports
module.exports = foo; // [Function: foo]
module.exports.foo = foo; // { foo: [Function: foo] }
module.exports = {foo}; // { foo: [Function: foo] }
很有意思,exports只能打点属性赋值导出,module.exports相比之下就灵活的多。这里解释一下为什么exports不能直接赋值导出,module.exports是真正要导出的部分,exports是module.exports的快捷访问方式(这样:exports=module.exports),直接对 exports赋值相当于之前的引用断了,重新指向了新的内存地址,也就说跟module.exports不再有关系,而此时module.exports的值还是{},所以无法导出我们想要的对象。
exports.foo = foo;
module.exports.tt = "红脸汉子";
// { foo: [Function: foo], tt: '红脸汉子' }
并没有发生什么意外的事情,不出所料出现在了同一屋檐下,毕竟两个变量指向同一个对象。
网友评论