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調用了我';這樣去賦值,保留初始值的對象形式或者本身賦值成引用類型對使用會比較方便。

小弟才疏學淺,講解較爲囉嗦,亦是初次寫之,如有疏漏,妄不吝賜教,特此感謝。

相關文章
相關標籤/搜索