2017-07-09 51 views
0

在發佈這個問題之前,我已經閱讀過幾篇關於SO的文章。我不清楚的一件事是,爲什麼我不能在將模塊導入時使用乘法函數。不是module.exports和exports是指同一個對象嗎?使用module.exports和exports時出錯

不應該乘以被添加到module.exports引用的對象。由於導出是module.exports的別名,因此我期待着我將相乘對象添加到同一對象,因爲我不會重新指定導出來引用其他內容。

module.exports = { 
    sum : function(a,b){ 
    return a+b; 
    } 
}; 

exports.multiply = function(a,b){ 
    return a*b; 
}; 

回答

1

請注意,在每個nodejs模塊文件的開始處,導​​出和module.exports都指向同一個空對象。你可以像下面的屬性分配給他們:

exports.item1 = "hi1" 

module.exports.item2 = "hi2" 

的出口現在都和module.exports具有相同的價值:

{item1:"hi1", item2: "hi2"} 

但是當你將對象分配給他們,只有對象你已經給了module.exports事務!在你的情況下,如果你想分配一個對象到module.exports,然後添加其他功能,你應該先將同一個對象分配給它們!現在,他們將指向同一個對象,並且如果將另一個函數分配給您的exports對象,則它也可以通過module.exports對象訪問。

更改代碼的第一行,它會正常工作!

exports = module.exports = { 
    sum : function(a,b){ 
    return a+b; 
    } 
}; 

exports.multiply = function(a,b){ 
    return a*b; 
}; 
+0

但據此,var exports = module.exports,不是出口,module.exports指向同一個對象。 –

+0

在代碼的第一行代碼段,我們將包含sum = function(){...}的對象分配給「exports」和「module.exports」。那麼我們將另一個函數(乘法)作爲屬性添加到同一個對象。 – tashakori

+0

測試用例:將上面的代碼保存爲m.js然後在另一個文件中寫入: var m = require(「./m.js」) console.log(m.sum(1,2)) console .log(m.multiply(1,2)) 它會按預期工作。 – tashakori

0

您無法訪問乘法函數,因爲javascript對象是通過引用傳遞的。當您使用line module.exports = {blah}時,您將創建一個新對象{blah}並將module.exports設置爲指向它。但是,出口仍然指向舊對象。

最初,module.exports和exports指向同一個空對象。 因此,exports = {},module.exports = {}。但是當你創建一個新的對象,並有module.exports指向它,例如:

module.exports = { 
    sum : function(a,b){ 
    return a+b; 
    } 
}; 

module.exports將指向新的對象,但出口仍然在舊的對象指向:

// exports will still point to the old object 
console.log(exports) // prints {} 
console.log(module.exports) // prints { sum: function() } 

然後:

console.log(exports) // prints {} 
exports.multiply = function(a,b){ 
    return a*b; 
}; 
console.log(exports) // prints { multiply: function() } 

當你導入模塊,將返回在module.exports的價值,所以你不會有機會獲得多重功能,因爲這是在出口的定義,它引用各色一nt對象。

如果你不想擔心這個問題,你可以這樣做:

exports = module.exports = { 
    sum : function(a,b){ 
    return a+b; 
    } 
}; 

這會讓他們引用同一個對象。因此,

exports.multiply = function(a,b){ 
    return a*b; 
}; 

將正常工作。