Node.js中module.exports?和exports使用誤區(qū)
一、module,module.exports ,exports含義
- module對(duì)象:在每個(gè) .js 自定義模塊中都有一個(gè) module 對(duì)象,它里面存儲(chǔ)了和當(dāng)前模塊有關(guān)的信息
- module.exports 對(duì)象:在node里自定義的模塊中,可以使用 module.exports 對(duì)象,將自定義的模塊內(nèi)部分的成員共享出去被使用。
- 當(dāng)外界(其他js文件)用require() 方法導(dǎo)入自定義模塊時(shí),得到的就是 module.exports 所指向的對(duì)象
- exports對(duì)象:由于 module.exports 單詞寫起來比較復(fù)雜,為了簡(jiǎn)化向外共享成員的代碼,Node 提供了 exports 對(duì)象。默認(rèn)情況下,exports 和 module.exports 指向同一個(gè)對(duì)象
注意:使用 require() 方法導(dǎo)入模塊時(shí),導(dǎo)入的結(jié)果,永遠(yuǎn)以 module.exports 指向的對(duì)象為準(zhǔn)
換句話說最終共享的結(jié)果,還是以 module.exports 指向的對(duì)象為準(zhǔn)
二.案例
通過案例來理解二者的關(guān)系
案例一:
定義代碼
//文件名:01.module.exports和exports誤區(qū) exports.name="小吳" module.exports ={ 性別:"男", age:18 }
輸出代碼
//文件名:01-test //為了測(cè)試module.exports ,exports指向結(jié)果 案例二三四的輸出代碼都是此js代碼文件 const obj=require("./01.module.exports和exports誤區(qū)") console.log(obj);
輸出結(jié)果
案例一解釋:因?yàn)槟J(rèn)情況下,exports 和 module.exports 指向同一個(gè)對(duì)象,所以開始二者都是指向一個(gè)空對(duì)象,當(dāng)export指向新對(duì)象name="小吳"后,此時(shí)二者都指向這個(gè)對(duì)象,但是執(zhí)行后面代碼則是在內(nèi)存中新開辟一個(gè)空間存儲(chǔ)新對(duì)象 {性別:“男”,age:18} ,且把這個(gè)新對(duì)象的引用交給了module.exports,則module.exports就指向新的對(duì)象,不指向之前的空對(duì)象了,而且由于最終共享的結(jié)果,以module.exports 指向的對(duì)象為準(zhǔn),所以案例輸出如上圖所示
案例二
定義代碼
module.exports.name="小吳" exports ={ 性別:"男", age:18 }
輸出結(jié)果
案例二解釋:同理當(dāng)module.exports指向?qū)ο髇ame="小吳"后,執(zhí)行后面代碼,,exports指向新對(duì)象{性別:“男”,age:18},由于最終共享的結(jié)果,還是以 module.exports 指向的對(duì)象為準(zhǔn)
所以案例輸出如上圖所示
案例三
定義代碼
exports.name="小吳" module.exports.age=18
輸出結(jié)果
案例三解釋:同理二者開始指向空對(duì)象,第一行代碼通過exports引用關(guān)系掛載了一個(gè)name屬性,第二行又通過module.exports引用關(guān)系掛載了一個(gè)屬性age 這里不存在新對(duì)象 都是掛載屬性 這些屬性都被放在了開始二者指向的空對(duì)象中,則最終兩個(gè)屬性都在此對(duì)象中,且module.exports指向這個(gè)對(duì)象,所以最終結(jié)果輸出如上圖所示
案例四
定義代碼
exports={ 性別:"男", name:"小吳", } module.exports=exports//把export的引用關(guān)系通過等號(hào)賦值給了module.exports module.exports.age=18
輸出結(jié)果
案例四解釋:同理二者開始指向同一空對(duì)象,執(zhí)行代碼,在內(nèi)存中定義了一個(gè)新對(duì)象,且把新對(duì)象掛載在exports上,此時(shí)exports就不指向之前的空對(duì)象而指向新定義的對(duì)象,module.exports=exports這行代碼把export的引用關(guān)系通過等號(hào)賦值給了module.exports,則module.exports也不指向之前的空對(duì)象了,也指向新對(duì)象了,最后給module.exports指向的新對(duì)象又繼續(xù)掛載了一個(gè)age屬性,所以里面的所有屬性都被module.exports指向到的,所以最終結(jié)果輸出如圖所示
重要注意:為了防止二者指向混亂,建議不要在同一個(gè)模塊中同時(shí)使用 exports 和 module.exports
到此這篇關(guān)于Node.js中module.exports 和exports使用誤區(qū)的文章就介紹到這了,更多相關(guān)Node.js module.exports和exports內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Express實(shí)現(xiàn)定時(shí)發(fā)送郵件的示例代碼
在開發(fā)中我們有時(shí)候需要每隔?一段時(shí)間發(fā)送一次電子郵件,或者在某個(gè)特定的時(shí)間進(jìn)行發(fā)送郵件,無需手動(dòng)去操作,基于這樣的情況下我們需要用到了定時(shí)任務(wù)。本文就來用Express實(shí)現(xiàn)定時(shí)發(fā)送郵件吧2023-04-04Node.js 進(jìn)程平滑離場(chǎng)剖析小結(jié)
這篇文章主要介紹了Node.js 進(jìn)程平滑離場(chǎng)剖析小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01Windows系統(tǒng)下安裝Node.js的步驟圖文詳解
這篇文章主要給大家介紹了Windows系統(tǒng)下Node.js的安裝教程,Node.js是用于后端編程的JavaScript框架,文中給出了詳細(xì)圖文介紹,有需要的朋友可以參考下,下面來一起看看吧。2016-11-11使用npm命令提示: ''npm'' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序的處理方法
這篇文章主要介紹了使用npm命令提示: 'npm' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序,本文通過圖文并茂的形式給大家分享解決方案,需要的朋友可以參考下2020-05-05輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn)
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn),本文先是組出了代碼,然后對(duì)代碼一一分析,需要的朋友可以參考下2014-12-12基于游標(biāo)的分頁(yè)接口實(shí)現(xiàn)代碼示例
這篇文章主要給大家介紹了關(guān)于基于游標(biāo)的分頁(yè)接口實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11node.js?實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼登錄功能
這篇文章主要介紹了node.js?實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼登錄功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08