js 常用設(shè)計(jì)模式

單例模式

單例模式解決了分組的問題,讓每個(gè)對(duì)象有了自己獨(dú)立的命名空間麦向,但是不能批量生產(chǎn),每一個(gè)新的對(duì)象都要重新寫一份一模一樣的代碼客叉。

var person = {
    name:'zhang san',
    age:25,
    sayName :function () {
        console.log(this.name);
    }
};
person.sayName();

工廠模式

把實(shí)現(xiàn)同一事情的相同代碼诵竭,放到一個(gè)函數(shù)中,以后如果再想實(shí)現(xiàn)這個(gè)功能兼搏,就不需要重新編寫這些代碼了卵慰,只要執(zhí)行當(dāng)前的函數(shù)即可,
這就是函數(shù)的封裝佛呻,體現(xiàn)了高內(nèi)聚裳朋、低耦合的思想:減少頁面的中的冗余代碼,提高代碼的重復(fù)利用率:

function xxx(name, age) {
    var obj = {};
    obj.name = name;
    obj.age = age;
    obj.sayName = function () {
        console.log(this.name);
    }
    return obj;
}

var p1 = xxx('zhang san' , 26);
p1.sayName ();

var p2 = xxx('li si' , 25);
p2.sayName ();

然而吓著,工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問題鲤嫡,但是沒有解決對(duì)象的識(shí)別問題,即無法知道一個(gè)對(duì)象的類型绑莺。

隨著 JavaScript 的發(fā)展暖眼,又出現(xiàn)了一種新的模式。

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

Script 中的構(gòu)造函數(shù)可以用來創(chuàng)建特定類型的對(duì)象纺裁。像 Object 和 Array 這樣的原生構(gòu)造函數(shù)诫肠,在運(yùn)行時(shí)會(huì)自動(dòng)在執(zhí)行環(huán)境中調(diào)用。

創(chuàng)建一個(gè)新對(duì)象对扶;
將構(gòu)造函數(shù)的作用域賦值給新對(duì)象(指向 this)区赵;
執(zhí)行構(gòu)造函數(shù)中的代碼;
返回新對(duì)象浪南。

function xxx(name, age) {
    this.name = name;
    this.age = age;
    this.sayName = function() {
        console.log(this.name);
    }
}

const p1 = new xxx('Zhang san', 18);
const p2 = new xxx('Li si', 18);

任何函數(shù)笼才,只要通過 new 操作符來調(diào)用,那么就可以作為構(gòu)造函數(shù)络凿;而任何函數(shù)骡送,如果不通過 new 操作符來調(diào)用昂羡,那它跟普通的函數(shù)也沒有什么兩樣。

構(gòu)造函數(shù)的問題

構(gòu)造函數(shù)雖然好用但也有缺點(diǎn)摔踱。使用構(gòu)造函數(shù)的主要問題虐先,就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。

function xxx(name, age) {
    this.name = name;
    this.age = age;
    this.sayName = new Function(console.log(this.name));
}

const p1 = new xxx('Zhang san', 18);
const p2 = new xxx('Li si', 18);

用這個(gè)函數(shù)創(chuàng)建 p1 和 p2 都有一個(gè)名為 sayName() 的方法派敷,但這兩個(gè)方法不是同一個(gè) Function 實(shí)例蛹批。

以這種方式創(chuàng)建函數(shù),會(huì)導(dǎo)出現(xiàn)不同的作用域鏈和標(biāo)識(shí)符解析篮愉,雖然它們做的事情是一樣的腐芍,但不同的實(shí)例沒有得到共享。

原型模式

我們創(chuàng)建的每一個(gè)函數(shù)其實(shí)都有一個(gè) prototype 屬性试躏,這個(gè)屬性是一個(gè)指針猪勇,指向一個(gè)對(duì)象,這個(gè)對(duì)象的屬性和方法被由這個(gè)函數(shù)創(chuàng)建的所有實(shí)例共享颠蕴。prototype 對(duì)象被稱為這些實(shí)例的原型對(duì)象泣刹。

function xxx(name, age) {
    this.name = name;
    this.age = age;
};

xxx.prototype.sayName = function() {
    console.log(this.name);
}

我們將 sayName() 方法和所有屬性直接添加到 xxx 的 prototype 屬性中,xxx 的所有實(shí)例就共用了同一個(gè)方法犀被,同時(shí)又保證該方法只在 xxx 作用域內(nèi)上生效椅您。

 vue.prototype.showAlert = function (title, content, leftOption = {
      title: '取消', onPress: () => {}
    }, rightOption =   {
      title: '確定', onPress: () => {}
    },showCancel) {
      GlobalConstant.store.commit('ALERT_MUTATION', {
        showAlert: true,
        title: title,
        content: content,
        leftText: leftOption.title,
        rightText: rightOption.title,
        showCancel:showCancel,
        leftCallback: () => {
          leftOption.onPress()
          GlobalConstant.store.commit('ALERT_MUTATION', {
            showAlert: false,
            showCancel:false
          })
        },
        rightCallback: () => {
          rightOption.onPress()
          GlobalConstant.store.commit('ALERT_MUTATION', {
            showAlert: false,
            showCancel:false
          })
        },

      })
    }





  this.showAlert('提示',  '您已有一筆未支付訂單,繼續(xù)下單將取消原訂單',
            { title: '支付原訂單', onPress: () => {this.$router.push({ name: 'MineOrder' })} },
            { title: '繼續(xù)下單', onPress: () => {this.fetchLockSeat()} },
    true)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弱判,一起剝皮案震驚了整個(gè)濱河市襟沮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昌腰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膀跌,死亡現(xiàn)場(chǎng)離奇詭異遭商,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捅伤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門劫流,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丛忆,你說我怎么就攤上這事祠汇。” “怎么了熄诡?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵可很,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我凰浮,道長(zhǎng)我抠,這世上最難降的妖魔是什么苇本? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮菜拓,結(jié)果婚禮上瓣窄,老公的妹妹穿的比我還像新娘。我一直安慰自己纳鼎,他們只是感情好俺夕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贱鄙,像睡著了一般劝贸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰逾,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天悬荣,我揣著相機(jī)與錄音,去河邊找鬼疙剑。 笑死氯迂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的言缤。 我是一名探鬼主播嚼蚀,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼管挟!你這毒婦竟也來了轿曙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤僻孝,失蹤者是張志新(化名)和其女友劉穎导帝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穿铆,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡您单,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荞雏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐秦。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凤优,靈堂內(nèi)的尸體忽然破棺而出悦陋,到底是詐尸還是另有隱情,我是刑警寧澤筑辨,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布俺驶,位于F島的核電站,受9級(jí)特大地震影響挖垛,放射性物質(zhì)發(fā)生泄漏痒钝。R本人自食惡果不足惜秉颗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望送矩。 院中可真熱鬧蚕甥,春花似錦、人聲如沸栋荸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晌块。三九已至爱沟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匆背,已是汗流浹背呼伸。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钝尸,地道東北人括享。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像珍促,于是被迫代替她去往敵國和親铃辖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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