1. 程式人生 > >Node.js中exports與module.exports的區別

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

個數 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的區別