Javascript模塊化編程(一):模塊的寫法

作者:阮一峰

日期:2012年10月26日

隨著網(wǎng)站逐漸變成"互聯(lián)網(wǎng)應(yīng)用程序"苛蒲,嵌入網(wǎng)頁的Javascript代碼越來越龐大帆喇,越來越復(fù)雜钓简。

網(wǎng)頁越來越像桌面程序逼龟,需要一個團(tuán)隊分工協(xié)作评凝、進(jìn)度管理、單元測試等等......開發(fā)者不得不使用軟件工程的方法腺律,管理網(wǎng)頁的業(yè)務(wù)邏輯奕短。

Javascript模塊化編程,已經(jīng)成為一個迫切的需求疾渣。理想情況下篡诽,開發(fā)者只需要實現(xiàn)核心的業(yè)務(wù)邏輯,其他都可以加載別人已經(jīng)寫好的模塊榴捡。

但是杈女,Javascript不是一種模塊化編程語言,它不支持""(class)吊圾,更遑論"模塊"(module)了达椰。(正在制定中的ECMAScript標(biāo)準(zhǔn)第六版,將正式支持"類"和"模塊"项乒,但還需要很長時間才能投入實用啰劲。)

Javascript社區(qū)做了很多努力,在現(xiàn)有的運行環(huán)境中檀何,實現(xiàn)"模塊"的效果蝇裤。本文總結(jié)了當(dāng)前"Javascript模塊化編程"的最佳實踐,說明如何投入實用频鉴。雖然這不是初級教程栓辜,但是只要稍稍了解Javascript的基本語法,就能看懂垛孔。

一藕甩、原始寫法

模塊就是實現(xiàn)特定功能的一組方法。

只要把不同的函數(shù)(以及記錄狀態(tài)的變量)簡單地放在一起周荐,就算是一個模塊狭莱。

function m1(){

//...

}

function m2(){

//...

}

上面的函數(shù)m1()和m2()僵娃,組成一個模塊。使用的時候腋妙,直接調(diào)用就行了默怨。

這種做法的缺點很明顯:"污染"了全局變量,無法保證不與其他模塊發(fā)生變量名沖突辉阶,而且模塊成員之間看不出直接關(guān)系先壕。

二、對象寫法

為了解決上面的缺點谆甜,可以把模塊寫成一個對象垃僚,所有的模塊成員都放到這個對象里面。

var module1 = new Object({

_count : 0,

m1 : function (){

//...

},

m2 : function (){

//...

}

});

上面的函數(shù)m1()和m2()规辱,都封裝在module1對象里谆棺。使用的時候,就是調(diào)用這個對象的屬性罕袋。

module1.m1();

但是改淑,這樣的寫法會暴露所有模塊成員,內(nèi)部狀態(tài)可以被外部改寫浴讯。比如朵夏,外部代碼可以直接改變內(nèi)部計數(shù)器的值。

module1._count = 5;

三榆纽、立即執(zhí)行函數(shù)寫法

使用"立即執(zhí)行函數(shù)"(Immediately-Invoked Function Expression仰猖,IIFE),可以達(dá)到不暴露私有成員的目的奈籽。

var module1 = (function(){

var _count = 0;

var m1 = function(){

//...

};

var m2 = function(){

//...

};

return {

m1 : m1,

m2 : m2

};

})();

使用上面的寫法饥侵,外部代碼無法讀取內(nèi)部的_count變量舟山。

console.info(module1._count); //undefined

module1就是Javascript模塊的基本寫法萄凤。下面,再對這種寫法進(jìn)行加工节榜。

四狼忱、放大模式

如果一個模塊很大膨疏,必須分成幾個部分,或者一個模塊需要繼承另一個模塊钻弄,這時就有必要采用"放大模式"(augmentation)成肘。

var module1 = (function (mod){

mod.m3 = function () {

//...

};

return mod;

})(module1);

上面的代碼為module1模塊添加了一個新方法m3(),然后返回新的module1模塊斧蜕。

五、寬放大模式(Loose augmentation)

在瀏覽器環(huán)境中砚偶,模塊的各個部分通常都是從網(wǎng)上獲取的批销,有時無法知道哪個部分會先加載洒闸。如果采用上一節(jié)的寫法,第一個執(zhí)行的部分有可能加載一個不存在空對象均芽,這時就要采用"寬放大模式"丘逸。

var module1 = ( function (mod){

//...

return mod;

})(window.module1 || {});

與"放大模式"相比,"寬放大模式"就是"立即執(zhí)行函數(shù)"的參數(shù)可以是空對象掀宋。

六深纲、輸入全局變量

獨立性是模塊的重要特點,模塊內(nèi)部最好不與程序的其他部分直接交互劲妙。

為了在模塊內(nèi)部調(diào)用全局變量湃鹊,必須顯式地將其他變量輸入模塊。

var module1 = (function ($, YAHOO) {

//...

})(jQuery, YAHOO);

上面的module1模塊需要使用jQuery庫和YUI庫镣奋,就把這兩個庫(其實是兩個模塊)當(dāng)作參數(shù)輸入module1币呵。這樣做除了保證模塊的獨立性,還使得模塊之間的依賴關(guān)系變得明顯侨颈。這方面更多的討論余赢,參見Ben Cherry的著名文章《JavaScript Module Pattern: In-Depth》

這個系列的第二部分哈垢,將討論如何在瀏覽器環(huán)境組織不同的模塊妻柒、管理模塊之間的依賴性。

(完)

原文:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耘分,一起剝皮案震驚了整個濱河市举塔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陶贼,老刑警劉巖啤贩,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拜秧,居然都是意外死亡痹屹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門枉氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來志衍,“玉大人,你說我怎么就攤上這事聊替÷シ荆” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵惹悄,是天一觀的道長春叫。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么暂殖? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任价匠,我火速辦了婚禮,結(jié)果婚禮上呛每,老公的妹妹穿的比我還像新娘踩窖。我一直安慰自己,他們只是感情好晨横,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布洋腮。 她就那樣靜靜地躺著,像睡著了一般手形。 火紅的嫁衣襯著肌膚如雪啥供。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天叁幢,我揣著相機與錄音滤灯,去河邊找鬼。 笑死曼玩,一個胖子當(dāng)著我的面吹牛鳞骤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播黍判,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼豫尽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顷帖?” 一聲冷哼從身側(cè)響起美旧,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贬墩,沒想到半個月后榴嗅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡陶舞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年嗽测,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肿孵。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡唠粥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出停做,到底是詐尸還是另有隱情晤愧,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布蛉腌,位于F島的核電站官份,受9級特大地震影響只厘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舅巷,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一懈凹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悄谐,春花似錦、人聲如沸库北。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寒瓦。三九已至情屹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杂腰,已是汗流浹背垃你。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喂很,地道東北人惜颇。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像少辣,于是被迫代替她去往敵國和親凌摄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 隨著網(wǎng)站逐漸變成"互聯(lián)網(wǎng)應(yīng)用程序"漓帅,嵌入網(wǎng)頁的Javascript代碼越來越龐大锨亏,越來越復(fù)雜。 一忙干、原始寫法模塊就...
    DaveWeiYong閱讀 251評論 0 0
  • 一器予、原始寫法 模塊就是實現(xiàn)特定功能的一組方法。 只要把不同的函數(shù)(以及記錄狀態(tài)的變量)簡單地放在一起捐迫,就算是一個模...
    L怪丫頭閱讀 1,762評論 0 0
  • 參考阮一峰老師的文字 http://www.ruanyifeng.com/blog/2012/10/javascr...
    Jalon閱讀 762評論 0 0
  • 一乾翔,原始寫法 模塊就是實現(xiàn)特定功能的一組方法。 只要把不同的函數(shù)(以及記錄狀態(tài)的變量)簡單地放在一起弓乙,就算是一個模...
    倔強的仙人掌閱讀 195評論 0 0
  • @轉(zhuǎn)自GitHub 介紹js的基本數(shù)據(jù)類型末融。Undefined、Null暇韧、Boolean勾习、Number、Strin...
    YT_Zou閱讀 1,163評論 0 0