摘要:原文博客地址單例模式系統(tǒng)中被唯一使用,一個(gè)類只有一個(gè)實(shí)例。中的單例模式利用閉包實(shí)現(xiàn)了私有變量兩者是否相等弱類型,沒有私有方法,使用者還是可以直接一個(gè),也會(huì)有方法分割線不是單例最簡單的單例模式,就是對象。
原文博客地址:https://finget.github.io/2018/11/06/single/單例模式
系統(tǒng)中被唯一使用,一個(gè)類只有一個(gè)實(shí)例。實(shí)現(xiàn)方法一般是先判斷實(shí)例是否存在,如果存在就返回,不存在就創(chuàng)建再返回。
在JavaScript里,單例作為空間提供者,從全局命名空間里提供一個(gè)唯一的訪問點(diǎn)來訪問該對象。
模式作用:
模塊間通信
系統(tǒng)中某個(gè)類的對象只能存在一個(gè)
保護(hù)自己的屬性和方法
注意事項(xiàng):
注意this的使用
閉包容易造成內(nèi)存泄漏,不需要的趕快干掉
注意new的成本
代碼示例java中的單例模式
java請類型可以私有化,外部new就會(huì)報(bào)錯(cuò)。
JavaScript中的單例模式
class SingleObject { login() { console.log("login") } } // 利用閉包實(shí)現(xiàn)了私有變量 SingleObject.getInstance = (fucntion () { let instance return function () { if (!instance) { instance = new SingleObject() } return instance } })() let obj1 = SingleObject.getInstance() obj1.login() let obj2 = SingleObject.getInstance() obj2.login() // 兩者是否相等 console.log(obj1 === obj2) // js弱類型,沒有私有方法,使用者還是可以直接new 一個(gè) SingleObject,也會(huì)有 login方法 console.log("------------分割線------------") let obj3 = new SingleObject() obj3.login() console.log("obj1===obj3",obj1 === obj3) // false 不是單例
最簡單的單例模式,就是對象。在 JavaScript 中 定義一個(gè)對象(Object),那么它的屬性,就只能通過它自己調(diào)用。就算兩個(gè)不同的對象,有相同的屬性名,也不能相互調(diào)用,保護(hù)了自己屬性。
登錄框 單例
class LoginForm { constructor() { this.state = "hide" } show() { if (this.state === "show") { alert("已經(jīng)顯示") return } this.state = "show" console.log("登錄框已顯示") } hide() { if (this.state === "hide") { alert("已經(jīng)隱藏") return } this.state = "hide" console.log("登錄框已隱藏") } } LoginForm.getInstance = (function () { let instance return function () { if (!instance) { instance = new LoginForm(); } return instance } })() // 一個(gè)頁面中調(diào)用登錄框 let login1 = LoginForm.getInstance() login1.show() // login1.hide() // 另一個(gè)頁面中調(diào)用登錄框 let login2 = LoginForm.getInstance() login2.show() // 兩者是否相等 console.log("login1 === login2", login1 === login2)最后
創(chuàng)建了一個(gè)前端學(xué)習(xí)交流群,感興趣的朋友,一起來嗨呀!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99539.html
摘要:單例模式單例模式就是保證一個(gè)類僅有一個(gè)實(shí)例并提供一個(gè)訪問它的全局訪問點(diǎn)其最大的特點(diǎn)就是永遠(yuǎn)只返回一個(gè)實(shí)例實(shí)例通過來獲取類的唯一對象其缺點(diǎn)也明顯增加了類的不透明性透明的單例模式最終會(huì)被返回使用代理實(shí)現(xiàn)單例模式將負(fù)責(zé)管理單例的邏輯移到了代理類中 單例模式 單例模式 就是保證一個(gè)類僅有一個(gè)實(shí)例, 并提供一個(gè)訪問它的全局訪問點(diǎn). 其最大的特點(diǎn)就是 永遠(yuǎn)只返回一個(gè)實(shí)例 var Sin...
摘要:所以程序在引入文件的時(shí)候用了單例模式,一個(gè)文件實(shí)例化一次,這種做法無疑是好的,但是也容易引起。在我們平時(shí)的開發(fā)過程中,可以借鑒這兩種方式去緩存變量,節(jié)點(diǎn)等。 這一章作者講了一個(gè)例子,就是在用單例模式生成一個(gè)dom節(jié)點(diǎn),還要做到只有訪問的時(shí)候才創(chuàng)建,后續(xù)訪問直接用前面創(chuàng)建的。那么實(shí)際開發(fā)中我們會(huì)用到這個(gè)模式嗎?現(xiàn)在我們基本都是用vue,react,angular開發(fā),不太會(huì)直接去操作do...
摘要:博主按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實(shí)現(xiàn)。單例模式用途如果一個(gè)類負(fù)責(zé)連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時(shí)需要單例模式來保證對象不被重復(fù)創(chuàng)建,以達(dá)到降低開銷的目的。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)...
摘要:博主按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實(shí)現(xiàn)。單例模式用途如果一個(gè)類負(fù)責(zé)連接數(shù)據(jù)庫的線程池日志記錄邏輯等等,此時(shí)需要單例模式來保證對象不被重復(fù)創(chuàng)建,以達(dá)到降低開銷的目的。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語言實(shí)現(xiàn)。誠然,每種設(shè)計(jì)模式都有多種實(shí)...
摘要:本系列為設(shè)計(jì)模式與開發(fā)實(shí)踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版單例模式實(shí)現(xiàn)單例模式單例模式的定義是保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。 本系列為《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版 單例模式 實(shí)現(xiàn)單例模式 單例模式的定義是:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。單例模式是一種常用的模式...
閱讀 1284·2021-11-15 18:14
閱讀 3173·2021-08-25 09:38
閱讀 2674·2019-08-30 10:55
閱讀 2706·2019-08-29 16:39
閱讀 1317·2019-08-29 15:07
閱讀 2457·2019-08-29 14:14
閱讀 824·2019-08-29 12:36
閱讀 923·2019-08-29 11:21