在 JavaScript 中實(shí)現(xiàn)單例
面向?qū)ο蟮能浖O(shè)計(jì)模式,它確保給定類只實(shí)例化一次。在許多不同情況下它都很有用,例如創(chuàng)建應(yīng)用程序中共享的全局對(duì)象。盡管JavaScript支持面向?qū)ο蟮木幊蹋珵榱藢?shí)現(xiàn)這個(gè)模式,它并沒有提供太多簡(jiǎn)單的選項(xiàng)。
最靈活且稍微高級(jí)的方法是使用。代理對(duì)象用于定義所謂的陷阱(traps)。陷阱是允許為某些操作(如屬性查找、賦值等)定義自定義行為的方法。單例模式規(guī)定給定類只能有一個(gè)實(shí)例。因此,最有用的陷阱是handler.construct()
,new
運(yùn)算符的陷阱。
事實(shí)證明,handler
本身只是一個(gè)對(duì)象。除了handler.constructor()
之外,我們可以使用處理程序來存儲(chǔ)我們要實(shí)例化的類的唯一實(shí)例以及是否已經(jīng)實(shí)例化。這樣,我們可以為任何需要轉(zhuǎn)換成單例的類創(chuàng)建一個(gè)可重用的處理程序?qū)ο?,同時(shí)還能為其他可能需要自定義的操作提供附加的陷阱。
以下是一個(gè)將class
這里有一個(gè)簡(jiǎn)單的實(shí)際示例,以便更好地理解它的作用:
在上面的例子中,你可以看到MySingletonClass
實(shí)例化第二次時(shí),沒有任何變化。這是因?yàn)橐呀?jīng)存在一個(gè)實(shí)例,所以它會(huì)返回該實(shí)例,而不是創(chuàng)建一個(gè)新對(duì)象。如前所述,這是一個(gè)singletonify
函數(shù)的基本實(shí)現(xiàn)。它可以被擴(kuò)展以進(jìn)一步修改行為,或者使用傳遞給構(gòu)造函數(shù)的某些數(shù)據(jù),在稍后調(diào)用中更新其持有的instance
。