JS_單例模式
- 什么是單例模式?
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
- 單例模式的優(yōu)點
- 可以用來劃分命名空間,減少全局變量的數(shù)量。
- 使用單體模式可以使代碼組織的更為一致,使代碼容易閱讀和維護。
- 可以被實例化,且實例化一次。
- 主要思想
無非是用一個變量來標(biāo)志當(dāng)前是否已經(jīng)為某個類創(chuàng)建過對象,如果是,則在下一次獲取該類的實例時,直接返回之前創(chuàng)建的對象。
接下來我們用JavaScript來強行實現(xiàn)這個思路,請看代碼:
- 版本一
class Box {
a = 1;
constructor() {
}
static getInstance() {
return Box._instance || (Box._instance = new Box());
}
}
var b = Box.getInstance();
var b1 = Box.getInstance();
console.log(b === b1);//true
//Box._instance = 10;//缺點:雖然實現(xiàn)了,但是能夠被修改
console.log(Box._instance);//打印10 Box._instance被暴露了
- 版本二
class Box {
a = 1;
constructor() {
}
static getInstance() {
if (!Box._instance) {
Object.defineProperty(Box, "_instance", { value: new Box() });
}
return Box._instance;
}
}
var b = Box.getInstance();
var b1 = Box.getInstance();
console.log(b === b1);//true
Box._instance = 10; //Box {a: 1}
console.log(Box._instance);//
- 版本三
class Box {
a = 1;
constructor() {
}
play() {
console.log("aaa");
}
static get instance() {
if (!Box._instance) {
Object.defineProperty(Box, "_instance", { value: new Box() });
}
return Box._instance;
}
}
Box.instance.play();//aaa
//通過設(shè)置get屬性,只能讀,不能寫
只需要生成一個唯一對象的時候,比如說頁面登錄框,只可能有一個登錄框,那么你就可以用單例的思想去實現(xiàn)他;
當(dāng)然你不用單例的思想實現(xiàn)也行,那帶來的結(jié)果可能就是你每次要顯示登陸框的時候都要重新生成一個登錄框并顯示(耗費性能),或者是不小心顯示出了兩個登錄框(等著吃項目經(jīng)理的40米長刀吧)