H5-2.25Javascript模塊模式

從javascript對象創(chuàng)建說起
說起Module(模塊)模式,可能一些剛剛接觸javascript的同學(xué)還是覺得比較陌生,但是相信大多數(shù)學(xué)習(xí)javascript的同學(xué)都知道javascript對象創(chuàng)建的方式。最熟悉的莫過于構(gòu)造器方式創(chuàng)建對象。
Constructor(構(gòu)造器)模式
基本Construcor(構(gòu)造器)

function Car(model,year,miles){
   this.model = model;
   this.year = year;
   this.miles = miles;

this.toShow = function(){
    return this.model + "已經(jīng)行駛了:" +this.miles + "公里!";
    }
 }

 //用法:

//可以創(chuàng)建car的新實例
var benz = new Car('Benz',2012,2000);
var bmw = new Car('bmw',2014,5000);

//打開瀏覽器控制臺(console),查看這些對象上           調(diào)用toShow()方法的輸出
   console.log(benz.toShow());
   console.log(bmw.toShow());

什么是模式

模式很容易被復(fù)用
就像上面的構(gòu)造器模式,它是我們創(chuàng)建對象的一種模式,只要掌握了這種模式,它就是一種立即可用的解決方案。構(gòu)造器模式給我們提出了快速大量簡單的創(chuàng)建javascript對象的辦法。

模式是已經(jīng)驗證的解決方法
解決方案其實就是開發(fā)人員的經(jīng)驗和見解,他們?yōu)槎x和改進這些方法提供了幫助。從而形成了模式。比如構(gòu)造器模式,從上面的列子就可以看出,為了更好的實現(xiàn)對象的創(chuàng)建,構(gòu)造器模式在慢慢的改進,讓其達到最能適合創(chuàng)建javascript對象的形式

模式富有表達力
看到模式時,通常就表示有一個設(shè)置好的結(jié)構(gòu)和表達解決方案的詞匯。很簡單,做項目時,只要你說通過原型的構(gòu)造器模式創(chuàng)建對象。那么大家都知道你說的是什么意思。或者你說這個問題可以用觀察者模式去解決。只要大家都熟悉觀察者模式,那么在程序員之間就少了很多溝通的障礙。

所以模式也就是一種可以復(fù)用的解決方案而已,用來解決軟件設(shè)計中遇到的常見問題。

Module(模塊)模式
模塊是任何強大應(yīng)用程序架構(gòu)中不可或缺的一部分,它通常能夠幫我們清晰的分離和組織項目中的代碼單元。簡單的比喻的話,javascript中模塊就類似于C#中的命名空空間,Java中的包。
在javasctipt中,有幾種用于實現(xiàn)模塊的方法,包括
對象字面量表示法

Module模式

AMD模塊

CommonJS模塊

ECMAScript Harmony模塊

對象字面量
對象字面量的表示法相信大家都不會陌生,一個對象被描述為一組包含在大括號( { } )中,以逗號(,)分隔的name/value對,對象內(nèi)的名稱可以是字符串或者標識符,后面跟著一個冒號。對象中最后一個name/value對的后面不能加逗號,不然會導(dǎo)致出錯

 var myObjectLiteral = {
variableKey:variableValue,
functionKey:function(){
    //...
  }
}




 var myModule = {
  myProperty:"someValue",

//對象字面量可以包含屬性和方法
//例如:可以聲明模塊的配置對象
//注意:無論是對象還是方法寫完,如果不是最后一個記得加上(,)
myConfig:{
    useCaching:true,
    language:'en'
},

//基本方法
myMethod:function(){
    console.log('輸出基本信息');
},

//根據(jù)配置輸出信息
myMethod2:function(){
    console.log('緩存是:' + (this.myConfig.useCaching)?'可用的':'不可用');
},

//重寫配置
myMethod3 = function(newConfig){
    if(typeof newConfig === 'object'){
        this.myConfig = newConfig;
        console.log(this.myConfig.language);
    }
}
};

//調(diào)用:

//輸出基本方法
myModule.myMethod();

//輸出:可用的
 myModule.myMethod2();

//輸出:fr
myModule.myMethod3({
   language:'fr',
   useCaching:false
});

Module(模塊)模式
在javascript中,Module模式用于進一步模擬類的概念,通過這種方式,可以使一個單獨的對象擁有公有/私有方法和變量,從而屏蔽來自全局作用域的特殊部分。產(chǎn)生的結(jié)果是:函數(shù)名與在頁面上其他腳本定義的函數(shù)沖突的可能性降低
私有
Module模式使用閉包封裝”私有”狀態(tài)和組織。它提供了一種包裝混合公有/私有方法和變量的方式,防止其泄露至全局作用域,并與別的開發(fā)人員的接口發(fā)生沖突。通過該模式,只需返回一個公有API,而其他的一切都維持在私有閉包里面。
這樣做為我們提供了一個屏蔽處理底層事件邏輯的整潔解決方案,同時只暴露一個接口供應(yīng)用程序的其他部分使用。該模式除了返回一個對象而不是一個函數(shù)之外,非常類似于一個立即調(diào)用的函數(shù)表達式(IIFE)

購物車實例
代碼:

  var basketModule = (function(){
         //購物車數(shù)組,私有變量
        var basket = [];
       //私有函數(shù)
       function doSomethingPrivate(){
       //。。。
      }
              
//私有函數(shù)
function doSomethingElsePrivate(){
    //。。。
}

//返回一個暴露出的公有對象
return {
    //添加item到購物車
    addItems:function(values){
        basket.push(values);
    },

    //獲得購物車里商品總數(shù)
    getItemCount:function(){
        return basket.length;
    },

    //私有函數(shù)的公有形式別名
    doSomething:doSomethingPrivate,

    //獲取所有商品的總價格
    getTotal:function(){
        var itemCount = this.getItemCount(),
            total = 0;
        while(itemCount--){
            total += basket[itemCount].price;
        }
        return total;
    }
};
})();

   //用法:
basketModule.addItem({
item:"面包",
price:5
});
basketModule.addItem({
item:"可樂",
price:2
});

 //2
console.log(basketModule.getItemCount());
//7
console.log(basketModule.getTotal());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,733評論 25 708
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 3,667評論 2 27
  • A1:片段將大腦記憶功組織比喻為RAM,意識比喻為CPU,要想高效運行就需及時清理RAM。這與前段時間閱讀的《稀缺...
    seeyou_00e4閱讀 357評論 1 4
  • 他叫王富,他娘在二十五年前生下了他,也正是生完他的那個冬天,寒風呼呼的,順著窗戶縫就進屋里了,剛好窗戶對著床頭,...
    無名指姑娘閱讀 1,585評論 0 2
  • 今年是正兒八經(jīng)高中畢業(yè)二十周年,我們農(nóng)班私下醞釀已久的大聚會,終于有了眉目,感謝同學(xué)玉成此事,正月初四的這場...
    楊書海閱讀 202評論 0 0