摘要:單例模式是一種重要的設(shè)計模式,有些對象我們只需要創(chuàng)建一個,比如瀏覽器的對象,模態(tài)對話框。普通類負責實現(xiàn)基本功能,代理類管理單例。
定義
保證一個類僅有以一個實例,僅能被實例化/創(chuàng)建一次,并提供全局的訪問點。
單例模式是一種重要的設(shè)計模式,有些對象我們只需要創(chuàng)建一個,比如瀏覽器的window對象,模態(tài)對話框。實現(xiàn)這種設(shè)計模式其實很簡單,最重要的是在創(chuàng)建實例的時候,用一個標記變量判斷實例是否已經(jīng)創(chuàng)建。
普通青年寫法function Singleton(name){ this.name = name; this.instance = null; } Singleton.prototype.getName = function(){ console.log("name: " + this.name); return this.name; } Singleton.getInstance = function(name){ if(!this.instance){ this.instance = new Singleton(name); } return this.instance; } var a = Singleton.getInstance("a"); var b = Singleton.getInstance("b"); alert(a === b);
點評:
該寫法不透明,使用者必須知道用Singleton.getInstance獲取單例,而非通過更加通用的方法new xxx方式。
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 SingletonDiv = (function(){ var instance; return function(html){ if(!instance){ instance = new CreateDiv(html); } return instance; } })() var a = SingletonDiv("yyh"); var b = SingletonDiv("yyh1");
點評:
使用代理類+普通的類,使得職責分明。普通類負責實現(xiàn)基本功能,代理類管理單例。CreateDiv可以直接生產(chǎn)一個實例,而加上代理,可以實現(xiàn)單例。有木有一種模塊拼湊的快感,這就實現(xiàn)了低耦合。
在ES6中,可以使用static方法代替閉包存儲單例。
靜態(tài)方法的單例模式class Singleton { constructor(name) { this.name = name; } static getInstance(name) { if(!Singleton.instance) { Singleton.instance = new Singleton(name) } return Singleton.instance; } getName() { return this.name; } } const singletonA = Singleton.getInstance("yyh1"); const singletonB = Singleton.getInstance("yyh2"); console.log(singletonA === singletonB); console.log(singletonA.getName() === singletonB.getName());
點評:ES6的靜態(tài)方法,和閉包一樣能在減少全局變量污染的同時,使標記變量更加長久的保存在內(nèi)存中不被回收。
老司機的新技能(更加通用的實現(xiàn)方式)// 負責創(chuàng)建DIV的基本功能 class CreateDiv { constructor(html) { this.html = html; this.init(); } init() { const div = document.createElement("div"); div.innerHTML = this.html; document.body.appendChild(div); } } // 負責管理單例 class ProxysingletonCreateDiv { constructor(htmlStr) { return ProxysingletonCreateDiv.getInstance(htmlStr); } static getInstance(name) { if(!ProxysingletonCreateDiv.instance) { ProxysingletonCreateDiv.instance = new CreateDiv(name) } return ProxysingletonCreateDiv.instance; } } const singletonC = new ProxysingletonCreateDiv("yyh1"); const singletonD = new ProxysingletonCreateDiv("yyh2"); console.log(singletonC === singletonD); singletonC.init(); singletonD.init();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93910.html
摘要:之前寫過兩篇面試官問能否模擬實現(xiàn)的操作符和面試官問能否模擬實現(xiàn)的方法其中模擬方法時是使用的和修改指向。但面試官可能問能否不用和來實現(xiàn)呢。使用模擬實現(xiàn)的瀏覽器環(huán)境非嚴格模式方法的屬性是。 之前寫過兩篇《面試官問:能否模擬實現(xiàn)JS的new操作符》和《面試官問:能否模擬實現(xiàn)JS的bind方法》 其中模擬bind方法時是使用的call和apply修改this指向。但面試官可能問:能否不用cal...
摘要:其中就包括定義塊級作用域的關(guān)鍵字塊級作用域如何用低版本模擬如何用低版本模擬加強版如何用低版本模擬自調(diào)用函數(shù)版 簡述 在JavaScript編程中,當我們使用關(guān)鍵字var時,該變量是在距離最近的函數(shù)內(nèi)部或是在全局詞法環(huán)境中定義的,即函數(shù)作用域。這是JavaScript由來已久的特性,{}并不一定限制變量作用域的模式也困擾了許多從其他語言轉(zhuǎn)向JavaScript的開發(fā)者。隨著前端工程的發(fā)展...
摘要:然而,臨近規(guī)范發(fā)布時,有建議提及未來的版本號切換為編年制,比如用同來指代在年末前被定稿的所有版本。總得來說就是版本號不再那么重要了,開始變得更像一個萬古長青的活標準。 你不知道的JS(下卷)ES6與之未來 第一章:ES的今與明 在你想深入這本書之前,你應(yīng)該對(在讀此書時)JavaScript的最近標準掌握熟練,也就是ES5(專業(yè)來說是ES 5.1)。在此,我們決定全方面地談?wù)撽P(guān)于將近的...
摘要:本文最早為雙十一而作,原標題雙大前端工程師讀書清單,以付費的形式發(fā)布在上。發(fā)布完本次預(yù)告后,捕捉到了一個友善的吐槽讀書清單也要收費。這本書便從的異步編程講起,幫助我們設(shè)計快速響應(yīng)的網(wǎng)絡(luò)應(yīng)用,而非簡單的頁面。 本文最早為雙十一而作,原標題雙 11 大前端工程師讀書清單,以付費的形式發(fā)布在 GitChat 上。發(fā)布之后在讀者圈群聊中和讀者進行了深入的交流,現(xiàn)免費分享到這里,不足之處歡迎指教...
摘要:本文最早為雙十一而作,原標題雙大前端工程師讀書清單,以付費的形式發(fā)布在上。發(fā)布完本次預(yù)告后,捕捉到了一個友善的吐槽讀書清單也要收費。這本書便從的異步編程講起,幫助我們設(shè)計快速響應(yīng)的網(wǎng)絡(luò)應(yīng)用,而非簡單的頁面。 本文最早為雙十一而作,原標題雙 11 大前端工程師讀書清單,以付費的形式發(fā)布在 GitChat 上。發(fā)布之后在讀者圈群聊中和讀者進行了深入的交流,現(xiàn)免費分享到這里,不足之處歡迎指教...
閱讀 2902·2023-04-26 02:14
閱讀 3751·2019-08-30 15:55
閱讀 1843·2019-08-29 16:42
閱讀 2757·2019-08-26 11:55
閱讀 2846·2019-08-23 13:38
閱讀 480·2019-08-23 12:10
閱讀 1308·2019-08-23 11:44
閱讀 2790·2019-08-23 11:43