国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > WEB開(kāi)發(fā) > 正文

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

2024-04-27 15:06:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

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

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

但是,Javascript不是一種模塊化編程語(yǔ)言,它不支持"類(lèi)"(class),更遑論"模塊"(module)了。

Javascript社區(qū)做了很多努力,在現(xiàn)有的運(yùn)行環(huán)境中,實(shí)現(xiàn)"模塊"的效果。本文總結(jié)了當(dāng)前"Javascript模塊化編程"的最佳實(shí)踐,說(shuō)明如何投入實(shí)用。

一、原始寫(xiě)法

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

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

  function m1(){    //...  }

  function m2(){    //...  }

上面的函數(shù)m1()和m2(),組成一個(gè)模塊。使用的時(shí)候,直接調(diào)用就行了。

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

二、對(duì)象寫(xiě)法

為了解決上面的缺點(diǎn),可以把模塊寫(xiě)成一個(gè)對(duì)象,所有的模塊成員都放到這個(gè)對(duì)象里面。

  var module1 = {

    _count : 0,

    m1 : function (){      //...    },

    m2 : function (){      //...    }

  };

上面的函數(shù)m1()和m2(),都封裝在module1對(duì)象里。使用的時(shí)候,就是調(diào)用這個(gè)對(duì)象的屬性。

  module1.m1();

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

  module1._count = 5;

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

使用"立即執(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    };

  })();

使用上面的寫(xiě)法,外部代碼無(wú)法讀取內(nèi)部的_count變量。

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

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

四、放大模式

如果一個(gè)模塊很大,必須分成幾個(gè)部分,或者一個(gè)模塊需要繼承另一個(gè)模塊,這時(shí)就有必要采用"放大模式"(augmentation)。

  var module1 = (function (mod){

    mod.m3 = function () {      //...    };

    return mod;

  })(module1);

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

五、寬放大模式(Loose augmentation)

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

  var module1 = ( function (mod){

    //...

    return mod;

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

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

六、輸入全局變量

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

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

  var module1 = (function ($, YAHOO) {

    //...

  })(jQuery, YAHOO);

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

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛扎县| 昌江| 宁城县| 怀来县| 云和县| 甘泉县| 轮台县| 城固县| 句容市| 叶城县| 福海县| 六安市| 兴仁县| 呼图壁县| 曲阜市| 额济纳旗| 利川市| 德格县| 红原县| 永吉县| 班玛县| 惠州市| 万荣县| 黑山县| 姚安县| 平陆县| 清水河县| 剑阁县| 南平市| 姚安县| 怀柔区| 乌兰浩特市| 平潭县| 澄迈县| 华阴市| 九龙坡区| 新源县| 大安市| 襄垣县| 嘉鱼县| 比如县|