JavaScript設(shè)計(jì)模式-單體模式

你將了解一種設(shè)計(jì)模式-單體模式哨鸭!
你將了解單體模式的優(yōu)點(diǎn)!

單體模式

單體模式的思想在于保證一個特定類僅有一個實(shí)例蔓腐。這意味著當(dāng)您第二次使用同一個類創(chuàng)建新對象的時候望侈,應(yīng)該得到與第一次所創(chuàng)建對象完全相同對象。

如何將這種模式模式應(yīng)用到 JavaScript 傀蚌?在 JavaScript 中沒有類基显,只有對象。實(shí)際上當(dāng)創(chuàng)建一個新對象時善炫,此新對象已經(jīng)是單體了撩幽。

創(chuàng)建一個新對象(單體)例子 :

var person = {
    name : 'Danile',
};

但在 JavaScript 中,對象之間永遠(yuǎn)不會完全相等销部,除非它們是同一個對象摸航,哪怕創(chuàng)建一個具有完全相同成員但同類對象,它也不會與第一個對象完全相同舅桩。例如:

var person2 = {
    name : 'Danile',
};

person === person2  // false
person == person2   // false

so~~在 JavaScript 創(chuàng)建一個對象的時候酱虎,實(shí)際上就是創(chuàng)建一個單體。

使用 new 操作符

JavaScript 中具有 new 語法可使用構(gòu)造函數(shù)來創(chuàng)建對象擂涛,而且有時可能需要使用這種語法但單體實(shí)現(xiàn)读串。這種思想在于當(dāng)使用同一個構(gòu)造函數(shù)以 new 操作符來創(chuàng)建多個對象時,應(yīng)該僅獲得指向完全相同的對象的新指針撒妈。

var person1 = new person();
var person2 = new person();

person1 = person2;  // true

person對象僅會在第一次調(diào)用構(gòu)造函數(shù)時被創(chuàng)建恢暖。在第二次(以及第三次以后)創(chuàng)建時將會返回同一個person對象。這就是為什么 person1 === person2狰右,因?yàn)樗鼈儽举|(zhì)上是指向同一個對象的兩個引用杰捂。

JavaScript 中如何實(shí)現(xiàn)該模式?

  • 可以使用全局變量來存儲該實(shí)例棋蚌。(不推薦)
  • 可以在構(gòu)造函數(shù)的靜態(tài)屬性中緩存該實(shí)例嫁佳。(缺點(diǎn)在于某些屬性是公開可訪問的屬性挨队,在外部代碼中可能會修改該屬性,以至于會丟失該實(shí)例)
  • 可以將該實(shí)例包裝在閉包中蒿往。這樣可以保證該實(shí)例的私有性并且保證該實(shí)例不會被構(gòu)造函數(shù)以外的代碼所修改盛垦。(缺點(diǎn)是帶來了額外的閉包開銷)

閉包中的實(shí)例

直接上代碼:

function Universe() {
    // 緩存實(shí)例
    var instance = this;

   // 緩存實(shí)例
    this.start_time = 0;
    this.bang = "Big";

    //重寫該構(gòu)造函數(shù)
    Universe = function () {
        return instance ;
    };
}

// 測試
var uni1 = new Universe();
var uni2 = new Universe();
uni1 === uni2;  // true

由此可見,第一次調(diào)用原始構(gòu)造函數(shù)時瓤漏,它會像往常一樣返回 this腾夯。依次類推,再次調(diào)用時蔬充,將執(zhí)行重寫的構(gòu)造函數(shù)蝶俱。

單體模式的優(yōu)點(diǎn)

第一個優(yōu)點(diǎn):劃分命名空間
當(dāng)在做項(xiàng)目的時候,肯定不是一個人在做娃惯,而是一伙人跷乐,當(dāng)一個頁面中包含多個js文件的時候肥败,由于每個人的變量命名不同趾浅,很大程度上會發(fā)生變量覆蓋的情況,而用單體模式馒稍,把變量保存在對象中皿哨,很好的避免了這一點(diǎn)。

第二個優(yōu)點(diǎn):提高代碼的閱讀性纽谒,維護(hù)性
使用單體模式证膨,每個方法都被封裝在對象中,而且每個方法只做一件事鼓黔,所在在后期代碼維護(hù)上央勒,只需要維護(hù)特定位置的代碼就可以了。

第三個優(yōu)點(diǎn):可以實(shí)例化澳化,但只能實(shí)例化一次

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崔步,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缎谷,更是在濱河造成了極大的恐慌井濒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件列林,死亡現(xiàn)場離奇詭異瑞你,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)希痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門者甲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砌创,你說我怎么就攤上這事虏缸∩茫” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵寇钉,是天一觀的道長刀疙。 經(jīng)常有香客問我,道長扫倡,這世上最難降的妖魔是什么谦秧? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮撵溃,結(jié)果婚禮上疚鲤,老公的妹妹穿的比我還像新娘。我一直安慰自己缘挑,他們只是感情好集歇,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著语淘,像睡著了一般诲宇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惶翻,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天姑蓝,我揣著相機(jī)與錄音,去河邊找鬼吕粗。 笑死纺荧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颅筋。 我是一名探鬼主播宙暇,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼议泵!你這毒婦竟也來了占贫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤肢簿,失蹤者是張志新(化名)和其女友劉穎靶剑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體池充,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桩引,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了收夸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑匠。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卧惜,靈堂內(nèi)的尸體忽然破棺而出厘灼,到底是詐尸還是另有隱情夹纫,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布设凹,位于F島的核電站舰讹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闪朱。R本人自食惡果不足惜月匣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奋姿。 院中可真熱鬧锄开,春花似錦、人聲如沸称诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寓免。三九已至癣诱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間再榄,已是汗流浹背狡刘。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工享潜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留困鸥,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓剑按,卻偏偏與公主長得像疾就,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艺蝴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361