理解node模塊的exports和module.exports


    exports是module.exports的引用,即var exports = module.exports。在一個模塊的開頭,這兩個值都指向同一個空對象:exports = module.exports={}。所以,exports只是后者的引用。這篇文章中,我們將通過三個例子,探究這兩者的關系和區別。

一. 模塊默認返回的是module.exports,即便你在自定義的模塊中明確寫出return exports,真正返回的仍然是module.exports。例如:

//a.js

var a =100;
exports=a;//module.exports={}, exports=a
return exports;//明確寫出返回exports

剛開始的時候,exports和module.exports相等(值是空對象的地址),但是后來exports又被賦值了一個變量a(值等於a),這樣exports和module.exports就不是一回事了(給對象的引用賦值,不會改變原來的對象)。

//b.js

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

返回的是空對象,說明a.js返回的值是module.exports而不是exports。

二.在exports上添加屬性也同樣會添加在module.exports上:

var a=100;
exports.a = a;//相當於給exports/module.exports添加了一個屬性a

這時候,給exports添加a屬性,也就相當於給module.exports添加了a屬性。

var modA = require("./a");
console.log(modA) //{a:100}//可以拿到exports上的a屬性

三.只要直接給module.exports賦值,exports上的各種賦值就會失效

var a =100;
exports.a =a;//exports={a:a}, module.exports = {a:a} module.exports
= function(){ console.log("can be output") } //module.exports指向新的內存空間,返回的是函數

從以上三個例子我們可以得到兩點結論:

1. 模塊輸出默認是module.exports,

2. 一旦直接賦值給module.exports或者exports,它們就代表不同的變量,此情況下,只有對module.exports的賦值才能被正常輸出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM