什么是单例模式:简单理解为,多个引用指向一块内存。用到的例子:如模态框,vuex不管怎么声明。仅此只有一个实例对象。
单例模式代码:
// 第一种方式 静态属性方式
class singleDog{
instance = null
static getInstance(){
if(this.instance == null){
this.instance = new singleDog();
}
return this.instance;
}
}
let s1 = singleDog.getInstance();
let s2 = singleDog.getInstance();
console.log(s1 === s2);//true
// 第二种方式--闭包的方式
class singleDog {
}
singleDog.getInstance = (function(){
let instance = null;
return function(){
if(instance == null){
instance = new singleDog();
}
return instance;
}
})();
let s1 = singleDog.getInstance();
let s2 = singleDog.getInstance();
console.log(s1 === s2)
例子:
/* 实现Storage,使得该对象为单例,基于 localStorage 进行封装。
实现方法 setItem(key,value) 和 getItem(key)。 */
class Storage{
static init(){
if(Storage.localStorage == null){
Storage.localStorage = new Storage();
}
}
setItem(key,value){
this[key] = value;
console.log(Storage.localStorage)
}
getTime(key){
return this[key];
}
}
Storage.init();
Storage.localStorage.setItem('key1','b');
// 闭包实现
/* 实现Storage,使得该对象为单例,基于 localStorage 进行封装。
实现方法 setItem(key,value) 和 getItem(key)。 */
function Storage(){
}
Storage.prototype.setItem = function(key,value){
this[key] = value;
}
Storage.prototype.getItem = function(key){
return this[key];
}
Storage.init = (function(){
let instance = null;
return function(){
if(instance == null){
instance = new Storage();
}
return instance;
}
})();
let ins1 = Storage.init();
ins1.setItem('key1','aaa');
console.log(ins1.getItem('key1'));
let ins2 = Storage.init();
console.log(ins1 === ins2)