JS設(shè)計模式——單體

1什么是單體

單體是javascript中最基本但是又是最有用的模式之一乳怎,它可以將代碼組織為一個邏輯單元,這個邏輯單元的代碼可以通過單一的變量進行訪問前弯。通過確保單體對象只存在一份實例,你就可以確信自己的所有代碼使用的同樣的全局資源,最簡單的單體實際就是一個對象字面量恕出。

var Signletion = {
    attribute1: true,
    attribute2: 10,
    method1: function() {},
    method2: function() {}
}

你可能沒有發(fā)覺這種單體對象與普通字面量有什么不同,按照傳統(tǒng)定義金蜀,單體是一個只能被實例化一次并且可以通過一個眾所周知的訪問點訪問的類。要是嚴格地的按照這個定義來說渊抄,前面的例子所展示的并不是一個單體,應(yīng)為它是一個不可被實例化的類班巩。這里我們把單體定義的更為廣義一些:單體是一個用來劃分命名空間并將一批方法和屬性組織在一起的對象嘶炭,如果它可以被實例化抱慌,那它只能被實例化一次眨猎。

2.1劃分命名空間

單體對象由兩個組成部分:包含著方法和屬性成員的對象自身,以及用于訪問它的變量寺渗。
在這里說下本人在項目中避免變量沖突的方法兰迫,一般在項目中定義變量都沒有用命名空間的習慣,都是在變量加自己名字的后綴汁果。

function findProduct(id){
            ....
        }
//同項目 成員 的代碼        
var resetProduct = $('reset-product');
var findProduct = $('find-product');

為了避免這種情況就需要命名空間。

var MyNameSpace ={
      findProduct;function(){
       }
}
var resetProduct = $('reset-product');
var findProduct = $('find-product');

命名空間還可以進一步分割鳄乏,現(xiàn)在的網(wǎng)頁的JavaScript中不僅有你自己的代碼棘利,還可能有庫代碼,廣告代碼等善玫。為了避免沖突,可以定義一個用來包含自己所有代碼的全局對象:

var GiantCorp = {}
然后把自己的全局變量裹唆,方法 分門別類的放入GiantCorp中只洒。

2.2用作特定網(wǎng)頁專用代碼的包裝器的單體

在項目中有些JavaScript是所有網(wǎng)頁都用的到的,但是有些JavaScript是某個網(wǎng)頁專用的毕谴,不會被用的別的地方距芬。最好把這兩種代碼分別包裝在自己的單體對象中循帐。

  NameSpace.PageName = {
            CONSTANT_1:true,
            method1:function(){},
            
            init:function(){
                
            }
        }
        window.onload = function(){
            NameSpace.PageName.init();
        }

3擁有私有變量的單體

3.1使用下劃線
GiantCorp = {
    //私有
    _stripWhitespace:function(){},
    //公共
    stringToArray:function(){}
}       

你可以通過下劃線告訴別人這是私有成員,不要修改它离斩,瘪匿,但是別人還是可以修改,棋弥,,人家不接受你的建議啊漾岳。粉寞。。

3.2使用閉包
        MyNameSpace.Singletion = (function(){
            var privateA = 1;
            var privateMethod = function(){};
            return {
                publicA:true,
                publicMethod:function(){}
            }
        })()

4惰性實例化

前面的單體都已一個共同點唧垦,他們都是在腳本加載時被創(chuàng)建出來的,對于資源密集或配置開銷較大的單體,也許更合適的方法是在使用的時候?qū)嵗?br> 這種惰性單體的特別之處在于蓄愁,對于他的訪問必須借助一個靜態(tài)方法:
Singleton.getInstance().methodName(),getInstance會檢查該單體是否已經(jīng)被實例化妇斤,如果么有那么將它實例化返回丹拯,如果已經(jīng)實例化直接返回現(xiàn)有實例站超。

MyNameSpace.Signleton = (function(){
    var privateAttribute1 = false;
    var privateAttribute2 = [1,2,3];
    function privateMethod1(){}
    function privateMethod2(){}
    return {
        publicAttribute1:true,
        publicAttribute2:10,
        publicMethod:function(){
            
        }
    }
})()

上面是一個正常的單體死相,下面我們把它改為惰性的:

MyNameSpace.Signleton = (function() {
            var uniqueInstance;

            function constructor() {
                var privateAttribute1 = false;
                var privateAttribute2 = [1, 2, 3];

                function publicMethod1() {};

                function publicMethod2() {};
                return {
                    publicAttribute1: true,
                    publicAttribute2: 10,
                    publicMethod1: function() {},
                    publicMethod2: function() {},
                }
            }
            return {
                getInstance: function() {
                    if (!uniqueInstance) {
                        uniqueInstance = constructor();
                    }
                    return uniqueInstance;
                }
            }
        })();
        console.log(MyNameSpace.Signleton.getInstance().publicAttribute1);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咬像,一起剝皮案震驚了整個濱河市生宛,隨后出現(xiàn)的幾起案子肮柜,更是在濱河造成了極大的恐慌,老刑警劉巖莱睁,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芒澜,死亡現(xiàn)場離奇詭異,居然都是意外死亡撰糠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門旨袒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來术辐,“玉大人,你說我怎么就攤上這事必孤∪鹛桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵幢哨,是天一觀的道長。 經(jīng)常有香客問我闸与,道長岸售,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任凸丸,我火速辦了婚禮,結(jié)果婚禮上解孙,老公的妹妹穿的比我還像新娘。我一直安慰自己弛姜,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布苍在。 她就那樣靜靜地躺著荠商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莱没。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天牙咏,我揣著相機與錄音嘹裂,去河邊找鬼。 笑死寄狼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伊磺。 我是一名探鬼主播删咱,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腋腮!你這毒婦竟也來了壤蚜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聪富,失蹤者是張志新(化名)和其女友劉穎著蟹,沒想到半個月后梢莽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸披,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年轻局,在試婚紗的時候發(fā)現(xiàn)自己被綠了样刷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡置鼻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出储藐,到底是詐尸還是另有隱情司蔬,我是刑警寧澤邑茄,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布肺缕,位于F島的核電站授帕,受9級特大地震影響同木,放射性物質(zhì)發(fā)生泄漏跛十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一洲尊、第九天 我趴在偏房一處隱蔽的房頂上張望奈偏。 院中可真熱鬧,春花似錦惊来、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矮男。三九已至,卻和暖如春昂灵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背管削。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甘晤,地道東北人线婚。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓塞弊,卻偏偏與公主長得像游沿,于是被迫代替她去往敵國和親诀黍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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