Node.js中exports與module.exports的區別

1、exports使用

test.jshtml

exports.name = function() {
    console.log('張三');
};

index.js使用數組

var test= require('./test.js');
test.name(); // '張三'

錯誤用法工具

exports = function() {
    console.log('張三');
};

這樣至關於給exports對象從新賦值,不能導出,調用模塊不能訪問exports對象及其屬性ui

說明this

  • exports對象實際上就是對module.exports的引用exports只是它的一個輔助工具,最終返回給調用的是Module.exports而不是exports
  • 若是你沒有顯式的給Module.exports設置任何屬性和方法,那麼你的模塊就是exports設置給Module.exports的屬性

2、module.exports使用

2.1 module.exports與exports使用順序問題spa

test.js .net

module.exports = {name:'張三'};
exports.getName = function(){
  console.log('李四')
};

 index.js使用code

var test = require('./test.js');
console.log(test.name); // 輸出結果 -> 張三
test.getName(); // Uncaught TypeError: test.getName is not a funtion

說明htm

  • 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

相關文章
相關標籤/搜索