亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript中實現單體模式分享

2019-11-20 13:17:50
字體:
來源:轉載
供稿:網友

單體模式作為一種軟件開發模式在眾多面向對象語言中得到了廣泛的使用,在javascript中,單體模式也是使用非常廣泛的,但是由于javascript語言擁有其獨特的面向對象方式,導致其和一些傳統面向對象語言雖然在單體模式的思想上是一致的,但是實現起來還是有差異的。

首先來看看傳統面向對象語言對于單體模式的定義:單體模式是只能被實例化一次并且可以通過一個眾所周知的訪問點來訪問的類。這個定義有兩點突出了傳統面向對象語言的特征,即類和實例化,所以對于傳統面向對象語言來講,單體模式是建立在其類和實例化的自然特性之上的,即使用關鍵字class定義一個類,該類可通過new關鍵字來實例化,但是需要保證每次被new實例化之后得到的都是同一個實例或者說只能通過new來調用其構造函數一次。

再來看看javascript中對于單體模式的定義:單體是一個用來劃分命名空間并將一批相關方法和屬性組織在一起的對象,如果它能夠被實例化,那么只能被實例化一次。對比上面的定義,你會發現這里的單體定義將其實質定義為對象,而不是傳統面向對象語言中的類,這也表明了javascript這門語言是基于對象的。同時后面又指出,如果能夠被實例化,這說明了在javascript中單體定義應該有好幾種方式,存在一種或幾種能夠被實例化即使用new關鍵字來創建單體對象的方式,但是這種方式不是javascript自身的自然特征,因為使用new關鍵字創造出來的對象,實際上都是通過function來模擬定義其構造函數的(雖然ES6開始支持class關鍵字了,但是目前還沒有得到瀏覽器廣泛支持),那么如何使用javascript的自然特征來實現單體模式呢?

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

這里定義了一個對象Singleton,內部包含若干屬性和方法,將其包含在頁面中,js載入的時候就創建了這個對象,在調用時使用Singleton.method1來調用,它的實例化是隨著頁面載入js解析執行過程中完成的,我們并沒有使用new關鍵字來實例化這個對象,這也是javascript中實現單體模式和傳統面向對象語言一個很大的不同。這種方式更為簡單易于理解。但是這種方式存在若干缺點,一個很明顯的缺點是它并沒有提供命名空間,其他程序員如果在頁面中也定義了一個Singleton變量,那么很容易改寫和混淆這個單體對象,于是針對這個問題,將其改寫如下:

var mySpace={};mySpace.Singleton={  attribute1:true,  attribute2:10,  method1:function(){  },  method2:function(arg){  }}


這里首先定義了一個mySpace的命名空間,然后將單體對象Singleton掛載在這個對象的下面,這大大減少了和其他程序員沖突以及誤操作的可能,即使其他人在全局作用域中定義一個Singleton變量,也不會污染到這個單體對象,這就實現了前面定義中所說的劃分命名空間并且將一些相關屬性和方法組織在一起的功能。

這個方法依然存在缺點,這個單體對象的所有屬性和方法都是共有的,外部可隨時訪問和修改,于是采用閉包來模擬私有屬性和方法,如下:

mySpace.Singleton=(function(){  var privateAttribute1=false;  var privateAttribute1=[1,2,3];  function privateMethod1(){  }  function privateMethod2(){  }  return {  publicAttribute1:true,  publicAttribute2:10,  publicMethod1:function(){    privateAttribute1=true;    privateMethod1();  },  publicMethod2:function(arg){    privateAttribute1=[4,5,6];    privateMethod2();  }  }})();


在這里我們直接給該單體對象賦值了一個匿名自執行的函數,在該函數中使用var和function關鍵字分別來定義其私有屬性和方法,這些在函數外部(單體對象外部)是無法直接訪問的,因為函數一執行完畢,其內部作用域的空間就會被回收,這也就是能夠利用閉包來模擬私有屬性和方法的原因所在。在該函數(閉包)中,同時最終返回一個對象,這個對象中包含一些公有方法和屬性,在外部可以直接調用,同時這些公有方法由于定義在函數內部,所以可以調用其私有屬性和方法,但是外界只能通過返回的公有方法和屬性來完成某些操作,不能夠直接調用Singleton.privateMethod1這些屬性。這就使得該單體對象既隔離了外界去直接訪問其私有屬性和方法,又提供給外界一些共有屬性和方法去完成某些操作。

這種匿名函數自執行所構造的單體模式在很多js庫中被廣泛使用,但是依然存在一個問題,如果我們在載入頁面的時候并不需要用到該對象,而且該對象的創建比較耗費開銷(如需要進行大量計算或需要多次訪問dom樹及其屬性等)時,合理的做法是需要它的時候再去創建它,而不是隨著js的解析執行直接去創建,這種概念被稱之為惰性加載(lazy loading),于是修改以上代碼如下:

mySpace.Singleton=(function(){    var uniqueInstance;    function constructor(){      var privateAttribute1=false;      var privateAttribute1=[1,2,3];      function privateMethod1(){      }      function privateMethod2(){      }      return {        publicAttribute1:true,        publicAttribute2:10,        publicMethod1:function(){          privateAttribute1=true;          privateMethod1();        },        publicMethod2:function(arg){          privateAttribute1=[4,5,6];          privateMethod2();        }      }    }    return {      getInstance:function(){       if(!uniqueInstance){         uniqueInstance=constructor();       }        return uniqueInstance;      }    }  })();

這里首先在匿名函數中定義了一個私有變量uniqueInstance,作為一個判斷單體對象是否被創建出來的句柄,然后將剛才所有對單體對象定義的屬性和方法都放在一個名為constructor的函數中,只有該函數調用了,才會創造出該單體對象,否則不會直接創建它。然后,返回一個對象,其包含一個getInstance方法,該方法是供外部調用的,調用該方法的時候首先判斷該單體對象是否存在,如果存在就直接返回它,否則調用constructor函數構造這個單體對象再返回它。最后如果我們調用該單體對象的某個方法,需要使用mySpace.Singleton.getInstance().publicMethod1(),這里,只有我們這樣調用的時候才會創建這個單體對象,否則該單體對象是不會被自動創建的,這實際上就實現了按需加載或者惰性加載。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免费久久久久| 一区二区av在线| 狠狠躁夜夜躁人人爽天天天天97| 精品国模在线视频| 97色在线播放视频| 在线观看欧美日韩| 国产99久久精品一区二区永久免费| 91在线视频免费| 精品视频久久久久久| 色婷婷综合久久久久| 欧美激情一二三| 日日狠狠久久偷偷四色综合免费| 97国产一区二区精品久久呦| 欧美影院久久久| 久久精品影视伊人网| 性金发美女69hd大尺寸| 18一19gay欧美视频网站| 亚洲精品成人久久| 国产精品99久久久久久白浆小说| 日韩中文字幕在线免费观看| 成人中心免费视频| 亚洲最大福利视频网站| 51ⅴ精品国产91久久久久久| 欧美劲爆第一页| 日韩av手机在线观看| 91亚洲精品久久久久久久久久久久| 欧美中文字幕在线观看| 国产精品91在线观看| 欧美视频国产精品| 久久香蕉国产线看观看av| 精品国产一区二区三区久久久| 亚洲综合成人婷婷小说| 8x拔播拔播x8国产精品| 国产成人一区二区| 国产欧美欧洲在线观看| 亚洲欧美日韩国产中文| 亚洲精品视频久久| 国产日本欧美在线观看| 久久亚洲国产精品成人av秋霞| 中文字幕一区电影| 亚洲一区二区少妇| 成人免费高清完整版在线观看| 亚洲国产美女精品久久久久∴| 日韩在线免费高清视频| 亚洲人在线观看| 亚洲成人性视频| 2024亚洲男人天堂| 亚洲欧洲激情在线| 亚洲精品国产综合区久久久久久久| 欧美国产在线电影| 性欧美视频videos6一9| 亚洲最新中文字幕| 国产精品777| 国产在线精品一区免费香蕉| 久久久999国产| www.久久久久| 日韩在线观看免费高清完整版| 日韩极品精品视频免费观看| 欧美日韩在线观看视频小说| 日韩小视频在线观看| 日韩av中文字幕在线| 日本高清+成人网在线观看| 在线观看亚洲区| 亚洲精品久久久一区二区三区| 欧美贵妇videos办公室| 懂色av影视一区二区三区| 国产精品视频26uuu| 国语自产精品视频在线看一大j8| 亚洲欧洲一区二区三区在线观看| 亚洲欧美一区二区激情| 欧美日韩国产综合视频在线观看中文| 欧美色图在线视频| 久久久亚洲欧洲日产国码aⅴ| 91国语精品自产拍在线观看性色| 国产中文日韩欧美| 亚洲字幕一区二区| 亚洲精品黄网在线观看| 亚洲美女在线视频| 成人免费视频97| 免费97视频在线精品国自产拍| 91在线精品视频| 麻豆乱码国产一区二区三区| 亚洲男人天堂2023| 欧美成人精品激情在线观看| 亚洲色图18p| 国产日韩欧美自拍| 国产精品电影久久久久电影网| 91久久精品视频| 亚洲午夜av电影| 欧美精品videos性欧美| 国产精品入口福利| 欧美成人在线免费视频| 日韩中文av在线| 日韩经典第一页| 九九精品在线观看| 日韩精品在线免费| 欧美精品久久久久久久| 精品国产户外野外| 久久男人资源视频| 91精品国产自产在线观看永久| 亚洲无av在线中文字幕| 日本久久久久亚洲中字幕| 国产精品久久97| 国产成人在线亚洲欧美| 日韩专区中文字幕| 国语自产精品视频在线看抢先版图片| 亚洲成人999| 97国产真实伦对白精彩视频8| www.欧美精品| 亚洲精品乱码久久久久久按摩观| 亚洲精品视频免费| 亚洲天堂免费在线| 久久999免费视频| 95av在线视频| 美女扒开尿口让男人操亚洲视频网站| 日韩高清人体午夜| 欧美最猛性xxxxx亚洲精品| 91国内精品久久| 91福利视频在线观看| 久久久久久久久久国产精品| 精品美女永久免费视频| 久久久999精品免费| 国产精品免费一区| 国产成人免费av电影| 伊人男人综合视频网| 亚洲国产另类久久精品| 欧美成人免费大片| 欧美一区在线直播| 国产丝袜精品视频| 成人h片在线播放免费网站| 国产一区二区三区在线| 国产一区二区丝袜高跟鞋图片| 亚洲精品日韩欧美| 精品视频久久久久久久| 亚洲欧美中文字幕| 欧洲一区二区视频| 欧美激情影音先锋| 在线中文字幕日韩| 欧美激情性做爰免费视频| 久久久久久久色| 成人在线小视频| 日韩在线观看成人| 欧美孕妇孕交黑巨大网站| www欧美日韩| 国产精品96久久久久久| 国产成人高潮免费观看精品| 疯狂欧美牲乱大交777| 欧美成人激情视频免费观看| 爽爽爽爽爽爽爽成人免费观看| 在线午夜精品自拍| 日韩成人中文电影| 国产精品高潮呻吟久久av野狼| 亚洲一区二区国产| 午夜精品福利电影| 91精品视频在线免费观看| 亚洲人成网在线播放| 欧美美最猛性xxxxxx| 国产mv久久久| 17婷婷久久www| 久久成人人人人精品欧| 少妇高潮久久77777| 亚洲美女性视频| 欧美丝袜第一区| 欧美巨猛xxxx猛交黑人97人|