前端設(shè)計模式

一肋联、6種設(shè)計模式

構(gòu)造函數(shù)constructor模式

構(gòu)造函數(shù)模式是創(chuàng)建特定類型的對象的一種模式古戴,把私有屬性綁定到函數(shù)內(nèi)部的this上,把一些私有方法寫到函數(shù)的原型鏈上, 然后通過new 關(guān)鍵字來創(chuàng)建一個實例對象。每個實例都會有自己的一份實例屬性饮睬,但同時又共享著方法,最大限度的節(jié)省了內(nèi)存篮奄。

//1.構(gòu)造函數(shù)模式
function Person(name,age){
    this.name = name;
    this.age = age;
}//方法都寫在原型鏈上面
Person.prototype.sayName = function(){
    return this.name;
}
var student = new Person('yuhuan',24)//每次new創(chuàng)建一個新的引用

工廠模式factory

需要一個對象的時候可以通過這個函數(shù)創(chuàng)建一個對象捆愁,
但是這個對象沒有構(gòu)造函數(shù),無法用 instanceof 的方法判斷是否為實例窟却。

//2.工廠模式factory
//對象是引用類型昼丑,存儲在堆內(nèi)存中,工廠模式的關(guān)鍵點是每次創(chuàng)建一個新的引用
function createPerson(name){
    var person={
      name: name,
      sayName: function(){console.log(this.name)}
    }
    return person;
}
createPerson('yuhuan')
createPerson('yuhuan').sayName() //createPerson('yuhuan') return出來一個對象person夸赫,方法調(diào)用菩帝,this指向調(diào)用方person
var t = createPerson('yuhuan').sayName;
t()//函數(shù)調(diào)用模式,t是函數(shù)茬腿,this指向window

因為不實現(xiàn)繼承呼奢,創(chuàng)建100次,就會有100個sayName方法

單例模式

保證一個類僅有一個實例切平,并提供一個獲得該實例的方法握础。
js中,每個對象字面量都可以看做是一個單例揭绑。

var singleton = {
        attr : 1,
        method : function(){ return this.attr; }
    }
var t1 = singleton ;
var t2 = singleton ;
t1 === t2 //true
t1.method() //1

單例模式的思路是:一個類能返回一個對象的引用(并且永遠是同一個)和一個獲得該實例的方法(靜態(tài)方法弓候,通常使用 getInstance 名稱)。那么當(dāng)我們調(diào)用這個方法時他匪,如果類持有的引用不為空就返回該引用菇存,否者就創(chuàng)建該類的實例,并且將實例引用賦值給該類保持的那個引用再返回邦蜜。同時將該類的構(gòu)造函數(shù)定義為私有方法依鸥,避免其他函數(shù)使用該構(gòu)造函數(shù)來實例化對象,只通過該類的靜態(tài)方法才能得到該類的唯一實例悼沈。

實現(xiàn)單例核心思想
使用數(shù)據(jù)緩存來存儲該單例贱迟,用作判斷單例是否已經(jīng)生成姐扮,是單例模式主要的實現(xiàn)思路。以下使用閉包方式來模擬私有數(shù)據(jù)衣吠。var instance相當(dāng)于People內(nèi)部的一個變量茶敏,不能被外界看到,這就是閉包的作用缚俏,模塊化惊搏,隱藏變量。

//3.單例模式singleton,常用來寫對話框dialog,每次彈出來的對話框就是同一個
var People = (function(){
    var instance;
    function createPerson(name){
      if(!instance){
        instance = new Init(name)
      }
      return instance;
    }
    function Init(name){
       this.name = name;
    } 
    return {
        createPerson: createPerson
    }
})()
var p1 = People.createPerson('yuhuan')
var p2 = People.createPerson('tang')
p1===p2 //true

混合模式mixing

建立在構(gòu)造函數(shù)模式的基礎(chǔ)上忧换,實現(xiàn)子類繼承父類的屬性和方法恬惯,子類可以在擴展屬性和方法。

//4.混合模式mixing
function inherit(superType, subType){
    subType.prototype  = Object.create(superType.prototype);
    subType.prototype.constructor = subType;
}
#使用方法
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function(){
    console.log(this.name);
};    

function Male(name, sex, age){
    Person.call(this, name, sex);
    this.age = age;
}
inherit(Person, Male);

// 在繼承函數(shù)之后寫自己的方法亚茬,否則會被覆蓋
Male.prototype.printAge = function(){
    console.log(this.age);
};

var m = new Male('Byron', 'm', 26);
m.printName();

模塊模式module

閉包來實現(xiàn)
使用立即執(zhí)行函數(shù)包裹代碼段酪耳,使內(nèi)部的私有變量和方法不會暴露出來,通過return函數(shù)給外部提供使用內(nèi)部方法的接口刹缝。
這樣的好處是不會污染全局變量碗暗,外部無法訪問或者改變模塊內(nèi)部的變量和方法。

//5.模塊模式module  一個模塊往往代表了一個封閉的作用域
var Person = (function(){
    var name = 'yuhuan'
    function sayName(){
        console.log(name)
    };//詞法作用域
    return{
        name:name,
        sayName: sayName
    }
})()
使用:
Person.sayName();// yuhuan
Person.name;//yuhuan

發(fā)布訂閱模式(觀察者模式)publish/subscribe

觀察者模式又叫發(fā)布訂閱模式(Publish/Subscribe)赞草,一個訂閱者對象訂閱發(fā)布者對象的特定活動讹堤,并在發(fā)布者對象的狀態(tài)發(fā)生改變后,訂閱者對象獲得通知厨疙。訂閱者也稱為觀察者,而被觀察的對象稱為發(fā)布者或主題疑务。
當(dāng)發(fā)生了一個重要的事件時沾凄,發(fā)布者將會通知(調(diào)用)所有訂閱者,并且可能經(jīng)常以事件對象的形式傳遞消息知允。(瀏覽器的事件也是觀察者模式)

使用觀察者模式撒蟀,可以自定義發(fā)布事件,事件處理函數(shù)温鸽,通過訂閱事件來觸發(fā)事件保屯,執(zhí)行函數(shù)。

/*6.發(fā)布訂閱模式publish/subscribe
瀏覽器控制臺運行演示:
EventCenter.on('hello',function(){ //發(fā)布'hello'
    console.log('hi')
})
EventCenter.fire('hello')//訂閱'hello'涤垫,得到輸出結(jié)果hi   
*/
var EventCenter = (function(){
    var events = {};//用來存儲所有的key/value
    //('hello',function(){})
    function on(evt,handler){
        //events['hello'] = []
        //然后 events['hello'] = [{
        //  handler: handler;
        //}]
        events[evt] = events[evt] || []
        events[evt].push({
            handler: handler
        });
    }
    function fire(evt,args){
        if(!events[evt]){
            return;
        }
        for(var i=0; i<events[evt].length;i++){
            events[evt][i].handler(args)
        }
    }
    function off(name){
        delete events[name]
    }
    //暴露出的api
    return {
        on: on,
        fire: fire,
        off: off//取消訂閱
    }
})();

二姑尺、使用發(fā)布訂閱模式寫一個事件管理器,實現(xiàn)如下方式調(diào)用

EventCenter.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
EventCenter.fire('change', '饑人谷');
EventCenter.off('change');
#發(fā)布訂閱模式
var EventCenter = (function(){
    var events = {};//用來存儲所有的key/value
    function on(evt,handler){
        events[evt] = events[evt] || []
        events[evt].push({
            handler: handler
        });
    }
    function fire(evt,args){
        if(!events[evt]){
            return;
        }
        for(var i=0; i<events[evt].length;i++){
            events[evt][i].handler(args)
        }
    }
    function off(name){
        delete events[name]
    }
    //暴露出的api
    return {
        on: on,
        fire: fire,
        off: off//取消訂閱
    }
})();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝠猬,一起剝皮案震驚了整個濱河市切蟋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榆芦,老刑警劉巖柄粹,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘鸟,死亡現(xiàn)場離奇詭異,居然都是意外死亡驻右,警方通過查閱死者的電腦和手機什黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堪夭,“玉大人愕把,你說我怎么就攤上這事∫瘃” “怎么了礼华?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拗秘。 經(jīng)常有香客問我圣絮,道長,這世上最難降的妖魔是什么雕旨? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任扮匠,我火速辦了婚禮,結(jié)果婚禮上凡涩,老公的妹妹穿的比我還像新娘棒搜。我一直安慰自己,他們只是感情好活箕,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布力麸。 她就那樣靜靜地躺著,像睡著了一般育韩。 火紅的嫁衣襯著肌膚如雪克蚂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天筋讨,我揣著相機與錄音埃叭,去河邊找鬼。 笑死悉罕,一個胖子當(dāng)著我的面吹牛赤屋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壁袄,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼类早,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了然想?” 一聲冷哼從身側(cè)響起莺奔,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后令哟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恼琼,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年屏富,在試婚紗的時候發(fā)現(xiàn)自己被綠了晴竞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狠半,死狀恐怖噩死,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情神年,我是刑警寧澤已维,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站已日,受9級特大地震影響垛耳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飘千,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一堂鲜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧护奈,春花似錦缔莲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厌秒,卻和暖如春抛虫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背简僧。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雕欺,地道東北人岛马。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像屠列,于是被迫代替她去往敵國和親啦逆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品笛洛,去做同樣的事情夏志,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,724評論 2 17
  • 1. 寫出 構(gòu)造函數(shù)模式苛让、混合模式沟蔑、模塊模式湿诊、工廠模式、單例模式瘦材、發(fā)布訂閱模式的范例厅须。 構(gòu)造函數(shù)模式 寫一個函數(shù),...
    蕭雪圣閱讀 251評論 0 0
  • 1.寫出 構(gòu)造函數(shù)模式食棕、混合模式朗和、模塊模式、工廠模式簿晓、單例模式眶拉、發(fā)布訂閱模式的范例。 構(gòu)造函數(shù)胡模式(constr...
    饑人谷_NewClass閱讀 384評論 0 1
  • 一憔儿、構(gòu)造函數(shù)模式忆植、混合模式、模塊模式皿曲、工廠模式唱逢、單例模式、發(fā)布訂閱模式的范例 單例模式單例就是保證一個類只有一個實...
    任少鵬閱讀 375評論 0 0
  • 前幾天說要寫劇評,然后在后臺留言里劫樟,《夏至未至》的呼聲最高痪枫,不得不說郭敬明真的是影響一代人的青春,早前的《小時代》...
    鄰家阿七閱讀 1,673評論 3 12