初學nodejs,該博客當做一篇筆記防止日后遺忘,如有描述不對的地方,望各位指出,
在node的模塊系統中,會有多個模塊之間互相參考的情況,舉個例子,如果A模塊如果參考了B模塊,而A模塊又想拿到B模塊中的一些變數與方法,那么就要在B模塊中將A模塊所需的引數與變數用exports來暴露出去,這就是exports的作用,具體詳細內容在這里不詳細介紹,總之知道他有這么個作用就行了,
而我們要想將一些東西暴露出去,常見的方法除了有exports,還有一個就是module.exports,這就會有很多小白疑惑,到底這兩兄弟應該怎么用以及如何使用,我們先來說說這兩的用法,
1、對于exports,我們可以使用以下方法,從以下代碼我們可以看出,使用exports的格式為:exports.xxx = xxx,
exports.x = 123 //將x=123暴露出去
exports.a = function(){ //將輸出123的a方法暴露出去
console.log("123")
}
2、對于module.exports,我們可以有兩種方法進行使用,一種與exports類似,都是在使用module.exports.xxx = xxx的形式,而另一種則是module.exports.xxx = { },在對外暴露的物件物件obj中放入自己想要暴露出去的引數或者方法 ,例如以下代碼段:
module.exports.a = 123 //第一種用法
module.exports.b = { //第二種用法
name:"張三",
age:18,
sayHello:function(){
console.log("Hello")
}
}
講完了module.exports與exports用法,接下來我們講講這兩姐妹的區別,首先我們會發現,module.exports比exports多了一種匯出的方式,很多人可能會對此有疑問,下面就解釋一下這個東西,首先,module.exports與exports在本質上是一個東西,為了驗證這個觀點,我們可以將module.exports == exports列印出來,發現是true,證明了這兩確實是一樣的,那么他們這兩個變數module.exports與exports,指向的就是同一個記憶體空間,他們變數保存的值是相同的記憶體空間的地址,看下圖可能更好李姐:

學習過前端深淺拷貝的都知道,這兩指向同一個物件,而對于參考資料型別,當其中一個通過.xxx的方式將物件當中的某個屬性改變時,下次再對該屬性進行讀取得到的就是改變之后的值,module.exports與exports通過.xxx的方式來向外暴露引數的同時,他們這兩個變數本身指向的那個物件并沒有改變,而是修改了其中的值而已,所以說module.exports與exports都能通過.xxx的方式暴露引數的原因,可以用一下代碼進行簡單驗證,得到的結果是在控制臺輸出123和456:
A.js
var a = require("./B").a
var b = require("./B").b
console.log(a);
console.log(b);
B.js
exports.a = 123;
module.exports.b = 456;
接下來講講為什么可以直接一個物件賦值給module.exports達到暴露引數的目的而exports卻不能,在前邊我們也提到過,exports和module.exports這兩個其實是變數,保存的是指向一個物件的記憶體地址,那么如果module.exports={ },這時候修改的就是一個物件中的exports屬性,并沒有修改變數當中的值,對于最終的效果沒什么影響,而exports=module.exports,如果這時候使用exports={ },那么就相當于exports指向斷開了,此時我們修改的就是exports這個變數當中的值也就是指向的記憶體地址而不是物件當中的值,所以在其他模塊中就無法得到暴露出去的引數,

我們可以用如下代碼來對exports={ }的匯出方法進行一個測驗,
A.js
var a = require("./B");
console.log(a.name);
a.sayname();
B.js
exports =
{
name:"張三",
sayname:function(){
console.log("123")
}
}
運行A.js后,我們就會發現如下的報錯,說明exports={ }這種使用方式行不通

如果換成module.exports,那么此時我們只是修改了物件當中的屬性,對于module.exports這個變數的值并沒有改變,如下代碼進行驗證:
A.js
var a = require("./B")
console.log(a.name);
a.sayname();
B.js
module.exports =
{
name:"張三",
sayname:function(){
console.log("123")
}
}
最后得到的結果如下:

總結:
exports不能使用直接給它賦值一個物件的方法來進行引數的暴露,因為這樣已經修改了變數的值,指向的地址就不對了,所以exports只能用exports.xxx=xxx的方式,而當我們需要暴露出去的引數以及方法較多時,我們可以使用module.exports={ },在物件中放入需要的引數以及方法,這樣就會比較簡便,而不至于要寫很多module.exports.xxx=xxx或者exports.xxx=xxx,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/395375.html
標籤:其他
下一篇:Jquery的選擇器。(重點在回顧的基礎上去理解之前沒有理解的選擇器)你選擇誰用滑鼠單機誰滑鼠單機到哪里才會有效果
