Node.js中exports與module.exports的區別
阿新 • • 發佈:2018-01-18
個數 error: years 信息 輸出 一個數 mil 導出 原來
一、exports使用
test.js
exports.name = function() { console.log(‘張三‘); };
index.js使用
var test= require(‘./test.js‘); test.name(); // ‘張三‘
錯誤用法
exports = function() { console.log(‘張三‘); };
這樣相當於給exports對象重新賦值,不能導出,調用模塊不能訪問exports對象及其屬性
說明
- exports對象實際上就是對module.exports的引用,exports只是它的一個輔助工具,最終返回給調用的是
Module.exports
而不是exports - 如果你沒有顯式的給
Module.exports
設置任何屬性和方法,那麽你的模塊就是exports設置給Module.exports的
屬性
二、module.exports使用
2.1 module.exports與exports使用順序問題
test.js
module.exports = {name:‘張三‘}; exports.getName = function(){ console.log(‘李四‘) };
index.js使用
var test = require(‘./test.js‘); console.log(test.name);// 輸出結果 -> 張三 test.getName(); // Uncaught TypeError: test.getName is not a funtion
說明
- module.exports對象不為空的時候exports對象就自動忽略,因為module.exports通過賦值方式已經和exports對象指向的變量不同了,exports對象怎麽改和module.exports對象沒關系了
- 所有的exports收集到的屬性和方法,都賦值給了
Module.exports
。當然,這有個前提,就是Module.exports
本身不具備任何屬性和方法。
如果
Module.exports
已經具備一些屬性和方法,那麽exports收集來的信息將被忽略
2.2 使用module.exports導出一個類
person.js
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +‘ is ‘+ this.age +‘ years old‘); }; };
index.js 使用
var Person = require(‘./person.js‘); var p1 = new Test(‘張三‘, 22); p1.about(); // 張三 is 22 years old
2.3 使用module.exports導出一個數組
test.js
module.exports = [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘];
index.js 使用
var test = require(‘./test.js‘); console.log(test[2]); // c
2.4 常見使用方法解釋
exports = module.exports = somethings
等價於
module.exports = somethings
exports = module.exports
說明
module.exports = somethings 是對 module.exports 進行了覆蓋,此時 module.exports 和 exports 的關系斷裂,module.exports 指向了新的內存塊,而 exports 還是指向原來的內存塊,為了讓 module.exports 和 exports 還是指向同一塊內存或者說指向同一個 “對象”,所以我們就 exports = module.exports 。
總結:
- exports是module.exports的一個引用
- require引用模塊後,返回給調用者的是module.exports而不是exports
exports.xxx
,相當於在導出對象上掛屬性,該屬性對調用模塊直接可見exports =
相當於給exports對象重新賦值,調用模塊不能訪問exports對象及其屬性- 如果此模塊是一個類,就應該直接賦值
module.exports
,這樣調用者就是一個類構造器,可以直接new實例
參考資料
https://www.zhihu.com/question/26621212
https://www.cnblogs.com/axl234/p/6405370.html
http://blog.csdn.net/pwiling/article/details/51958693
Node.js中exports與module.exports的區別