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

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

 更新時間:2017年12月22日 09:24:13   作者:三十億少女的夢  
這篇文章主要介紹了JavaScript實(shí)現(xiàn)單例模式實(shí)例以及代碼講解,有需要的讀者們跟著學(xué)習(xí)參考下吧。

傳統(tǒng)單例模式

保證一個類僅有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)。

實(shí)現(xiàn)單例核心思想

無非是用一個變量來標(biāo)志當(dāng)前是否已經(jīng)為某個類創(chuàng)建過對象,如果是,則在下一次獲取該類的實(shí)例時,直接返回之前創(chuàng)建的對象,接下來我們用JavaScript來強(qiáng)行實(shí)現(xiàn)這個思路,請看代碼:

var Singleton = function( name ){
  this.name = name;
};
Singleton.prototype.getName = function(){   alert ( this.name );
};
Singleton.getInstance = (function(){   var instance = null;
  return function( name ){
          if ( !instance ){
            instance = new Singleton( name );
          }
        return instance;       }
})();

我們通過Singleton.getInstance來獲取Singleton類的唯一對象,這樣確實(shí)是沒問題的,但是js本身是沒有類這種概念的,所以我們強(qiáng)行用傳統(tǒng)單例思想來實(shí)現(xiàn)是沒有任何意義的,這樣的代碼又臭又長(其實(shí)是我自己看著不舒服嘻嘻嘻)。下面我們使用JavaScript的閉包來實(shí)現(xiàn)一個單例,請看代碼:

var CreateDiv = (function(){       var instance;
      var CreateDiv = function( html ){           if ( instance ){
            return instance;           }
          this.html = html; this.init();
          return instance = this;
};
CreateDiv.prototype.init = function(){
var div = document.createElement( 'div' );
div.innerHTML = this.html; 
document.body.appendChild( div );
      };
      return CreateDiv; })();
var a = new CreateDiv( 'sven1' ); var b = new CreateDiv( 'sven2' );
alert ( a === b ); // true

可以看到,這樣我們確實(shí)用閉包來實(shí)現(xiàn)了一個單例,但這個代碼還是高度耦合的,CreateDiv的構(gòu)造函數(shù)實(shí)際上負(fù)責(zé)了兩件事情。第一是創(chuàng)建對象和執(zhí)行初始化init方法,第二是保證只有一個對象。這樣的代碼是職責(zé)不明確的,現(xiàn)在我們要把這兩個工作分開,構(gòu)造函數(shù)就負(fù)責(zé)構(gòu)建對象,至于判斷是返回現(xiàn)有對象還是構(gòu)造新的對象并返回,我們交給另外一個函數(shù)去完成,其實(shí)也就是為了滿足一個編程思想:單一職責(zé)原則。這樣的代碼才能更好的解耦,請看下面代碼:

var CreateDiv = function (html) {
    this.html = html;
    this.init();
  };
  CreateDiv.prototype.init = function () {
    var div = document.createElement('div');
    div.innerHTML = this.html;
    document.body.appendChild(div);
  };
  var ProxySingletonCreateDiv = (function () {
    var instance;
    return function (html) {
      if (!instance) {
        instance = new CreateDiv(html);
      }
      return instance;
    }
  })();
  var a = new ProxySingletonCreateDiv('sven1');
  var b = new ProxySingletonCreateDiv('sven2');
  alert(a === b); //true

可以看到,現(xiàn)在我們的構(gòu)造函數(shù)CreateDiv現(xiàn)在只負(fù)責(zé)構(gòu)造對象,至于是返回現(xiàn)有對象還是構(gòu)造新的對象并返回,這件事我們交給了代理類proxySingletonCreateDiv來處理,這樣的代碼看著才舒(zhuang)服(bi)嘛!

最后貼一個高度抽象的單例模式代碼,惰性單例的精髓!

//單例模式抽象,分離創(chuàng)建對象的函數(shù)和判斷對象是否已經(jīng)創(chuàng)建
  var getSingle = function (fn) {
    var result;
    return function () {
      return result || ( result = fn.apply(this, arguments) );
    }
  };

形參fn是我們的構(gòu)造函數(shù),我們只要傳入任何自己需要的構(gòu)造函數(shù),就能生成一個新的惰性單例。比如說傳入創(chuàng)建一個女朋友的構(gòu)造函數(shù),并且調(diào)用getSingle(),就能生成一個新的女朋友。如果以后再調(diào)getSingle(),也只會返回剛才創(chuàng)建的那個女朋友。至于新女朋友——不存在的。

單例常用場景

只需要生成一個唯一對象的時候,比如說頁面登錄框,只可能有一個登錄框,那么你就可以用單例的思想去實(shí)現(xiàn)他,當(dāng)然你不用單例的思想實(shí)現(xiàn)也行,那帶來的結(jié)果可能就是你每次要顯示登陸框的時候都要重新生成一個登陸框并顯示(耗費(fèi)性能),或者是不小心顯示出了兩個登錄框。

以上就是我們給大家分享的關(guān)于JS實(shí)現(xiàn)單例模式的相關(guān)學(xué)習(xí)的心得,感謝大家對腳本之家的支持。

相關(guān)文章

  • 了不起的11個JavaScript代碼重構(gòu)最佳實(shí)踐小結(jié)

    了不起的11個JavaScript代碼重構(gòu)最佳實(shí)踐小結(jié)

    這篇文章主要介紹了了不起的11個JavaScript代碼重構(gòu)最佳實(shí)踐小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JavaScript數(shù)組去重的幾種方法

    JavaScript數(shù)組去重的幾種方法

    這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組去重的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • antd項(xiàng)目實(shí)現(xiàn)彩蛋效果的詳細(xì)代碼

    antd項(xiàng)目實(shí)現(xiàn)彩蛋效果的詳細(xì)代碼

    這篇文章主要介紹了antd項(xiàng)目如何實(shí)現(xiàn)彩蛋效果,首先在components目錄下創(chuàng)建Transform目錄,包括index.css、index.js,index.js是主要的邏輯代碼,下面對代碼進(jìn)行分析,需要的朋友可以參考下
    2022-09-09
  • Js放到HTML文件中的哪個位置有什么區(qū)別

    Js放到HTML文件中的哪個位置有什么區(qū)別

    先明白js能放在HTML的那個位置,分別是head和body中。大部分人都是放到head里面的。下面為大家介紹下放到這兩個地方的區(qū)別
    2013-08-08
  • JS學(xué)習(xí)筆記之閉包小案例分析

    JS學(xué)習(xí)筆記之閉包小案例分析

    這篇文章主要介紹了JS學(xué)習(xí)筆記之閉包,結(jié)合具體案例形式分析了javascript實(shí)現(xiàn)與使用閉包的相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • 詳解如何使用JavaScript實(shí)現(xiàn)自定義的雙向數(shù)據(jù)綁定

    詳解如何使用JavaScript實(shí)現(xiàn)自定義的雙向數(shù)據(jù)綁定

    雙向數(shù)據(jù)綁定是一種編程模式,用于在用戶界面和數(shù)據(jù)模型之間實(shí)現(xiàn)數(shù)據(jù)的同步更新,它允許用戶界面中的數(shù)據(jù)變化自動更新到數(shù)據(jù)模型中,在這篇文章中,我會使用基于觀察者模式和基于Proxy對象來實(shí)現(xiàn)JS的自定義雙向數(shù)據(jù)綁定
    2023-08-08
  • js給table賦值的實(shí)例代碼

    js給table賦值的實(shí)例代碼

    下面小編就為大家?guī)硪黄猨s給table賦值的實(shí)例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼

    JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了JavaScript Canvas實(shí)現(xiàn)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 使用three.js實(shí)現(xiàn)炫酷的酸性風(fēng)格3D頁面效果

    使用three.js實(shí)現(xiàn)炫酷的酸性風(fēng)格3D頁面效果

    本文內(nèi)容主要介紹,通過使用React+three.js技術(shù)棧,加載3D模型、添加3D文字、增加動畫、點(diǎn)擊交互等,配合樣式設(shè)計,實(shí)現(xiàn)充滿設(shè)計感的酸性風(fēng)格頁面
    2021-10-10
  • 基于javascript實(shí)現(xiàn)的購物商城商品倒計時實(shí)例

    基于javascript實(shí)現(xiàn)的購物商城商品倒計時實(shí)例

    本文主要介紹了基于javascript實(shí)現(xiàn)的購物商城商品倒計時實(shí)例,代碼詳細(xì),可直接復(fù)制試試看效果。需要的朋友可以參考借鑒
    2016-12-12

最新評論

兴化市| 宁海县| 武义县| 寿阳县| 曲麻莱县| 修文县| 威信县| 卓尼县| 烟台市| 阿合奇县| 田阳县| 进贤县| 自贡市| 河北省| 洛阳市| 民权县| 沂水县| 湘潭县| 济宁市| 西华县| 儋州市| 隆回县| 金乡县| 甘孜县| 西畴县| 嵩明县| 岳普湖县| 翁牛特旗| 富裕县| 合作市| 石首市| 盐城市| 永仁县| 上犹县| 黎城县| 竹北市| 通海县| 金寨县| 武安市| 古浪县| 蓬莱市|