最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中實(shí)現(xiàn)單體模式分享

 更新時(shí)間:2015年01月29日 09:20:48   投稿:junjie  
這篇文章主要介紹了JavaScript中實(shí)現(xiàn)單體模式分享,單體模式的定義:單體是一個(gè)用來劃分命名空間并將一批相關(guān)方法和屬性組織在一起的對象,如果它能夠被實(shí)例化,那么只能被實(shí)例化一次,需要的朋友可以參考下

單體模式作為一種軟件開發(fā)模式在眾多面向?qū)ο笳Z言中得到了廣泛的使用,在javascript中,單體模式也是使用非常廣泛的,但是由于javascript語言擁有其獨(dú)特的面向?qū)ο蠓绞?,?dǎo)致其和一些傳統(tǒng)面向?qū)ο笳Z言雖然在單體模式的思想上是一致的,但是實(shí)現(xiàn)起來還是有差異的。

首先來看看傳統(tǒng)面向?qū)ο笳Z言對于單體模式的定義:單體模式是只能被實(shí)例化一次并且可以通過一個(gè)眾所周知的訪問點(diǎn)來訪問的類。這個(gè)定義有兩點(diǎn)突出了傳統(tǒng)面向?qū)ο笳Z言的特征,即類和實(shí)例化,所以對于傳統(tǒng)面向?qū)ο笳Z言來講,單體模式是建立在其類和實(shí)例化的自然特性之上的,即使用關(guān)鍵字class定義一個(gè)類,該類可通過new關(guān)鍵字來實(shí)例化,但是需要保證每次被new實(shí)例化之后得到的都是同一個(gè)實(shí)例或者說只能通過new來調(diào)用其構(gòu)造函數(shù)一次。

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

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

  },
  method2:function(arg){

  }
}

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

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

  },
  method2:function(arg){

  }
}


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

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

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();
  }

  }

})();


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

這種匿名函數(shù)自執(zhí)行所構(gòu)造的單體模式在很多js庫中被廣泛使用,但是依然存在一個(gè)問題,如果我們在載入頁面的時(shí)候并不需要用到該對象,而且該對象的創(chuàng)建比較耗費(fèi)開銷(如需要進(jìn)行大量計(jì)算或需要多次訪問dom樹及其屬性等)時(shí),合理的做法是需要它的時(shí)候再去創(chuàng)建它,而不是隨著js的解析執(zhí)行直接去創(chuàng)建,這種概念被稱之為惰性加載(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;
      }
    }

  })();

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

相關(guān)文章

  • JS打開新窗口防止被瀏覽器阻止的方法

    JS打開新窗口防止被瀏覽器阻止的方法

    這篇文章主要介紹了JS打開新窗口防止被瀏覽器阻止的方法,分析對比了常用方法與改進(jìn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2015-01-01
  • 微信小程序?qū)崿F(xiàn)多列選擇器

    微信小程序?qū)崿F(xiàn)多列選擇器

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)多列選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 詳解webpack的文件監(jiān)聽實(shí)現(xiàn)(熱更新)

    詳解webpack的文件監(jiān)聽實(shí)現(xiàn)(熱更新)

    這篇文章主要介紹了詳解webpack的文件監(jiān)聽實(shí)現(xiàn)(熱更新),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 自己封裝的常用javascript函數(shù)分享

    自己封裝的常用javascript函數(shù)分享

    這里給大家推薦一個(gè)自己封裝的常用的javascript函數(shù),基本上常見的操作都包含在內(nèi)了,有需要的小伙伴直接拿走使用吧。
    2015-01-01
  • js圖片放大鏡實(shí)例講解(必看篇)

    js圖片放大鏡實(shí)例講解(必看篇)

    下面小編就為大家?guī)硪黄猨s圖片放大鏡實(shí)例講解(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • JavaScript對數(shù)字的判斷與處理實(shí)例分析

    JavaScript對數(shù)字的判斷與處理實(shí)例分析

    這篇文章主要介紹了JavaScript對數(shù)字的判斷與處理方法,實(shí)例分析了javascript判斷數(shù)字的常見方法與針對數(shù)字處理的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 教你5分鐘學(xué)會(huì)用requirejs(必看篇)

    教你5分鐘學(xué)會(huì)用requirejs(必看篇)

    下面小編就為大家?guī)硪黄棠?分鐘學(xué)會(huì)用requirejs(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • JavaScript中的作用域與閉包、原型與原型鏈、異步與單線程

    JavaScript中的作用域與閉包、原型與原型鏈、異步與單線程

    JavaScript的三座大山指的是:作用域和閉包、原型和原型鏈、異步與單線程,這些概念在日常的開發(fā)工作中經(jīng)常被提及,并對我們理解和編寫高質(zhì)量的JavaScript代碼至關(guān)重要
    2024-02-02
  • 詳解 微信小程序開發(fā)框架(MINA)

    詳解 微信小程序開發(fā)框架(MINA)

    小程序使用的是MINA框架,目的是通過簡單、高效的方式讓開發(fā)者可以在微信中開發(fā)具有原生App體驗(yàn)的服務(wù)。 這篇文章主要介紹了微信小程序開發(fā)框架(MINA),需要的朋友可以參考下
    2019-05-05
  • 深入理解JavaScript中的for循環(huán)

    深入理解JavaScript中的for循環(huán)

    這篇文章主要給大家深入的介紹了JavaScript中的for循環(huán),其中包括ES5中的三種for循環(huán),分別是簡單for循環(huán)、for-in以及forEach,另外還詳細(xì)介紹了ES6新增的一種循環(huán):for-of ,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02

最新評論

呼和浩特市| 福清市| 浏阳市| 宁都县| 沈阳市| 三穗县| 金秀| 永丰县| 宝鸡市| 连平县| 荣昌县| 玉溪市| 临湘市| 吉首市| 社旗县| 龙山县| 桃园市| 岑溪市| 于都县| 贵阳市| 会东县| 青阳县| 福贡县| 确山县| 竹山县| 炉霍县| 石屏县| 米脂县| 巴里| 甘谷县| 湘潭市| 揭东县| 德州市| 浦江县| 图片| 刚察县| 乌兰县| 宣恩县| 霍林郭勒市| 台东县| 金川县|