單例模式的定義:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
//第一種
varsingleton
=function
( name )
; singleton.prototype.
getname
=function()
; singleton.
getinstance
=function
( name )
return
this
.instance;};
var a = singleton.
getinstance
('sven1');
var b = singleton.
getinstance
('sven2');
alert
( a === b )
;// true
//第二種
varsingleton
=function
( name )
; singleton.prototype.
getname
=function()
; singleton.getinstance =
(function()
return instance;}}
)();
我們現在的目標是實現乙個「透明」的單例類,使用者從這個類中建立物件的時候,可以像使用其他任何普通類一樣。在下面的例子中,我們將使用 creatediv 單例類,它的作用是負責在頁面中建立唯一的 div 節點
var creatediv =
(function()
this
.html = html;
this
.init()
;return instance =
this;}
; creatediv.prototype.
init
=function()
;return creatediv;})
();var a =
newcreatediv
('sven1');
var b =
newcreatediv
('sven2');
alert
( a === b )
;// true
問題:破壞了「單一職責原理」creatediv的建構函式實際上負責了兩件事情。第一件事建立物件和初始化init方法,第二件是保證只有乙個物件。
var
creatediv
=function
( html )
; creatediv.prototype.
init
=function()
; 接下來引入**類 proxysingletoncreatediv:
var proxysingletoncreatediv =
(function()
return instance;}}
)();
var a =
newproxysingletoncreatediv
('sven1');
var b =
newproxysingletoncreatediv
('sven2');
alert
( a === b )
;
解決了上面的 「單一職責原理」
現在我們就把如何管理單例的邏輯從原來的**中抽離出來,這些邏輯被封裝在 getsingle函式內部,建立物件的方法 fn 被當成引數動態傳入 getsingle 函式接下來將用於建立登入浮窗的方法用引數 fn 的形式傳入 getsingle,我們不僅可以傳入還能傳createscript、createiframe、createxhr 等。之之後再讓 getsingle 返回乙個新的函式,並且用乙個變數 result 來儲存 fn 的計算結果。result 變數因為身在閉包中,它永遠不會被銷毀。在將來的請求中,如果 result 已經被賦值,那麼它將返回這個值。
var
getsingle
=function
( fn )};
varcreateloginlayer
=function()
;var createsingleloginlayer =
getsingle
( createloginlayer )
; document.
getelementbyid
('loginbtn').
onclick
=function()
; 下面我們再試試建立唯一的 iframe 用於動態載入第三方頁面:
var createsingleiframe =
getsingle
(function()
); document.
getelementbyid
('loginbtn').
onclick
=function()
;
getsingle函式中,用到了閉包和高階函式的概念。單例模式是一種既簡單又實用的模式,特別是惰性單例技術,再適合的時候才建立物件,並且只建立乙個。更有意思的是建立物件和和管理單例職責被分布在不同的方法中,當兩個方法組合起來的時候才會具備單例模式的特性。 JS設計模式 單例模式
單例模式是乙個用來劃分命名空間並將一批屬性和方法組織在一起的物件,如果它可以被例項化,那麼它只能被例項化一次。單例模式優點 並非所有的物件字面量都是單例,比如模擬資料基本結構 let cat 上面物件字面量結構是建立單例模式的方法之一,但並不是單例模式,單例模式的特點是僅被例項化一次 要實現單例模式...
JS設計模式 單例模式
理解 單例即只能例項乙個物件,無論new多少次,new出來的都是同乙個物件 這裡用了閉包儲存了instance變數,用於判斷是否已經建立了例項,建立了則直接返回,否則new乙個例項返回 單例模式 const grilfriend function let instance null return f...
js設計模式 單例模式
顧名思義,單例就是單一的意思,單例模式的定義是 保證乙個類僅有乙個乙個例項,並提供乙個訪問它的全域性訪問點。新建物件時判斷全域性是否有該物件,如果有,就返回該物件,沒有就建立乙個新物件返回。簡單實現 var single function return function name return in...