关于module.exports和exports在模块化编程中的差异,我们先来看看两个伪代码。
第一个代码是node官方文档的,她的意思是exports变量是一个指向module.exports的引用,当对exports赋值之后,他不再指向原来的那个值了。
再来看另外一个稍微详细的代码,两者意思都差不多。
最初exports={},通过这句代码module = {exports:exports},我们知道他们都指向了一个{}对象,当module.exports指向新的对象时,exports变量就断开了与module.exports的引用通过exports=module.exports让exports重新指向module.exports的引用。这里感觉很绕,不过没关系,因为node官方推荐:当我们觉得exports和module.exports很难琢磨时,我们只用module.exports对外暴露方法。
我们看如下代码:
module.exports.name=123;
console.info(exports);
console.info("---------------------------------");
console.info(module);
运行结果如下:
{ name: 123 }
---------------------------------
Module {
id: '.',
exports: { name: 123 },
parent: null,
filename: 'E:\\nodespace\\hello\\public\\src\\js\\module.js',
loaded: false,
children: [],
paths:
[ 'E:\\nodespace\\hello\\public\\src\\js\\node_modules',
'E:\\nodespace\\hello\\public\\src\\node_modules',
'E:\\nodespace\\hello\\public\\node_modules',
'E:\\nodespace\\hello\\node_modules',
'E:\\nodespace\\node_modules',
'E:\\node_modules' ] }
这句代码说明我们对module.exports.name设置值后,exports也会跟着变化,当我们通过module.exports={}导出时,exports并不会跟着改变。
exports.name=123;
module.exports={name:234};
console.info(exports);
console.info("---------------------------------");
console.info(module);
输出结果:
{ name: 123 }
---------------------------------
Module {
id: '.',
exports: { name: 234 },
parent: null,
filename: 'E:\\nodespace\\hello\\public\\src\\js\\module.js',
loaded: false,
children: [],
paths:
[ 'E:\\nodespace\\hello\\public\\src\\js\\node_modules',
'E:\\nodespace\\hello\\public\\src\\node_modules',
'E:\\nodespace\\hello\\public\\node_modules',
'E:\\nodespace\\hello\\node_modules',
'E:\\nodespace\\node_modules',
'E:\\node_modules' ] }
这两个例子其实就说明了对象在引用传值时的问题,如果a=b={name:123};这时候b.name=234,这时候a.name也会变化,因为他们指向了同一个引用,如果这时候b={name:234},那么a.name是不会跟着改变的。