Node.js中module.exports和exports的区别

看了好多篇博客,对于module.exports和exports区别的解释众说纷纭有点迷糊,仍是本身写demo来感觉一下吧。javascript

module.exports和exports的默认值java

console.log(module);     //Module {  id: '.', exports: {}, ...}
console.log(exports);    //{}

能够看到module.exports和exports的默认值都是空对象(对象是引用类型!)ui

foo.jscode

exports.foo = 'exports调用了我';
console.log(module.exports); //{ foo: 'exports调用了我' }
console.log(exports);        //{ foo: 'exports调用了我' }

module.exports.foo = 'module调用了我';
console.log(module.exports);  //{ foo: 'module调用了我' }
console.log(exports);         //{ foo: 'module调用了我' }

main.js对象

var foo= require('./foo');
console.log(foo);    //{ foo: 'module调用了我' }

结论:require调用的是module.exports当中的值,而exports则是module.exports的引用,二者调用的是同一个内存地址。ip

foo.js内存

exports = 'exports调用了我';
console.log(module.exports); //{}
console.log(exports);        //{ foo: 'exports调用了我' }

main.js字符串

var foo= require('./foo');
console.log(foo);    //{}

若是你对引用类型的理解不够深入,直接给exports赋值。会形成exports被另一个内存地址替换,也就中断得了module.exports和exports的联系。同步

但你又想让他们赋值相同,你能够这么作。
foo.js博客

exports = 'exports调用了我';
module.exports = exports;
console.log(module.exports); //{foo: 'exports调用了我'}
console.log(exports);        //{ foo: 'exports调用了我' }

二者的值又相同。由于栗子里用的是字符串,是普通类型,意味着每次改变值都得用module.exports = exports;去从新同步值。因此仍是不建议exports = 'exports调用了我';这样去赋值,保留初始值的对象形式或者本身赋值成引用类型对使用会比较方便。

小弟才疏学浅,讲解较为啰嗦,亦是初次写之,如有疏漏,妄不吝赐教,特此感谢。

相关文章
相关标签/搜索