麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > JavaScript > 正文

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

2019-11-19 14:40:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

傳統(tǒng)單例模式

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

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

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

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

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

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

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)造對(duì)象,至于是返回現(xiàn)有對(duì)象還是構(gòu)造新的對(duì)象并返回,這件事我們交給了代理類(lèi)proxySingletonCreateDiv來(lái)處理,這樣的代碼看著才舒(zhuang)服(bi)嘛!

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

//單例模式抽象,分離創(chuàng)建對(duì)象的函數(shù)和判斷對(duì)象是否已經(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ù),就能生成一個(gè)新的惰性單例。比如說(shuō)傳入創(chuàng)建一個(gè)女朋友的構(gòu)造函數(shù),并且調(diào)用getSingle(),就能生成一個(gè)新的女朋友。如果以后再調(diào)getSingle(),也只會(huì)返回剛才創(chuàng)建的那個(gè)女朋友。至于新女朋友――不存在的。

單例常用場(chǎng)景

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产日韩三区 | 久久人人爽人人爽人人片av高清 | 中国av中文字幕 | 成人店女老板视频在线看 | 视频一区国产精品 | 成人午夜视频在线观看 | 久久久久久久久久久国产精品 | 久草在线播放视频 | 中文字幕欧美亚洲 | 欧美色爱综合 | 黄色视屏免费观看 | www.91视频com| 国产成人观看 | 精品一区久久久 | 国产亚洲网 | 黄色网址在线免费播放 | 欧美成人一区免费视频 | 国产精品久久久久久久久久久久久久久久 | 精品国产91久久久久久 | 精品一区二区三区日本 | 无码专区aaaaaa免费视频 | 国产一区二区在线免费 | 国产91对白叫床清晰播放 | 性高潮一级片 | 国产精品中文在线 | 欧美一级特黄特色大片免费 | 91在线视频精品 | 国产黄色录像片 | 国产精品视频不卡 | 精品一区二区久久久久 | 91av大片| 国产一区二区不卡 | 久久人人爽人人爽人人片av高清 | 蜜桃视频在线免费播放 | 中文字幕免费一区 | 久久久久久久久浪潮精品 | 亚洲国产小视频 | 精品一区二区三区日本 | 91av原创| 成人羞羞视频在线观看 | 精品一区二区久久久久久久网精 |