您好,登錄后才能下訂單哦!
nodejs中exports與module.exports的區(qū)別是什么?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
app.js
var a = {name: 'nswbmw 1'}; var b = a; console.log(a); console.log(b); b.name = 'nswbmw 2'; console.log(a); console.log(b); var b = {name: 'nswbmw 3'}; console.log(a); console.log(b);
運(yùn)行 app.js 結(jié)果為:
{ name: 'nswbmw 1' } { name: 'nswbmw 1' } { name: 'nswbmw 2' } { name: 'nswbmw 2' } { name: 'nswbmw 2' } { name: 'nswbmw 3' }
解釋一下:a 是一個(gè)對(duì)象,b 是對(duì) a 的引用,即 a 和 b 指向同一個(gè)對(duì)象,即 a 和 b 指向同一塊內(nèi)存地址,所以前兩個(gè)輸出一樣。當(dāng)對(duì) b 作修改時(shí),即 a 和 b 指向同一塊內(nèi)存地址的內(nèi)容發(fā)生了改變,所以 a 也會(huì)體現(xiàn)出來(lái),所以第三、四個(gè)輸出一樣。當(dāng)對(duì) b 完全覆蓋時(shí),b 就指向了一塊新的內(nèi)存地址(并沒(méi)有對(duì)原先的內(nèi)存塊作修改),a 還是指向原來(lái)的內(nèi)存塊,即 a 和 b 不再指向同一塊內(nèi)存,也就是說(shuō)此時(shí) a 和 b 已毫無(wú)關(guān)系,所以最后兩個(gè)輸出不一樣。
明白了上述例子后,我們進(jìn)入正題。
我們只需知道三點(diǎn)即可知道 exports 和 module.exports 的區(qū)別了:
exports 是指向的 module.exports 的引用
module.exports 初始值為一個(gè)空對(duì)象 {},所以 exports 初始值也是 {}
require() 返回的是 module.exports 而不是 exports
所以:我們通過(guò)
var name = 'nswbmw'; exports.name = name; exports.sayName = function() { console.log(name); }
給 exports 賦值其實(shí)是給 module.exports 這個(gè)空對(duì)象添加了兩個(gè)屬性而已,上面的代碼相當(dāng)于:
var name = 'nswbmw'; module.exports.name = name; module.exports.sayName = function() { console.log(name); }
我們通常這樣使用 exports 和 module.exports
一個(gè)簡(jiǎn)單的例子,計(jì)算圓的面積:
使用 exports
app.js
var circle = require('./circle'); console.log(circle.area(4));
circle.js
exports.area = function(r) { return r * r * Math.PI; }
使用 module.exports
app.js
var area = require('./area'); console.log(area(4));
area.js
module.exports = function(r) { return r * r * Math.PI; }
上面兩個(gè)例子輸出是一樣的。你也許會(huì)問(wèn),為什么不這樣寫呢?
app.js
var area = require('./area'); console.log(area(4));
area.js
exports = function(r) { return r * r * Math.PI; }
運(yùn)行上面的例子會(huì)報(bào)錯(cuò)。這是因?yàn)?,前面的例子中通過(guò)給 exports 添加屬性,只是對(duì) exports 指向的內(nèi)存做了修改,而
exports = function(r) { return r * r * Math.PI; }
其實(shí)是對(duì) exports 進(jìn)行了覆蓋,也就是說(shuō) exports 指向了一塊新的內(nèi)存(內(nèi)容為一個(gè)計(jì)算圓面積的函數(shù)),也就是說(shuō) exports 和 module.exports 不再指向同一塊內(nèi)存,也就是說(shuō)此時(shí) exports 和 module.exports 毫無(wú)聯(lián)系,也就是說(shuō) module.exports 指向的那塊內(nèi)存并沒(méi)有做任何改變,仍然為一個(gè)空對(duì)象 {} ,也就是說(shuō) area.js 導(dǎo)出了一個(gè)空對(duì)象,所以我們?cè)?app.js 中調(diào)用 area(4) 會(huì)報(bào) TypeError: object is not a function 的錯(cuò)誤。
所以,一句話做個(gè)總結(jié):當(dāng)我們想讓模塊導(dǎo)出的是一個(gè)對(duì)象時(shí),exports 和 module.exports 均可使用(但 exports也不能重新覆蓋為一個(gè)新的對(duì)象),而當(dāng)我們想導(dǎo)出非對(duì)象接口時(shí),就必須也只能覆蓋 module.exports。
我們經(jīng)??吹竭@樣的用寫法:
exports = module.exports = somethings;
上面的代碼等價(jià)于
module.exports = somethings; exports = module.exports;
原因也很簡(jiǎn)單,module.exports = somethings 是對(duì) module.exports 進(jìn)行了覆蓋,此時(shí) module.exports 和 exports 的關(guān)系斷裂,module.exports 指向了新的內(nèi)存塊,而 exports 還是指向原來(lái)的內(nèi)存塊,為了讓 module.exports 和 exports 還是指向同一塊內(nèi)存或者說(shuō)指向同一個(gè) “對(duì)象”,所以我們就 exports = module.exports。
關(guān)于nodejs中exports與module.exports的區(qū)別是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。