概念
保证一个 class 仅有一个实例,并提供一个可以访问到的全局访问点,但在javascript 中是没有 class 的概念,需要使用全局变量实现。
示例
var obj = {
instance: null, // 1. 声明一个全局变量标识
setName: function( name ){ // 2. 设置 name 方法
this.name = name
},
getName: function() { // 3. 获取 name 方法
console.log(this.name)
},
setInstance: function(name) { // 4. 判断 instance 类是否被创建
if(!this.instance){
this.instance = obj.setName(name)
}
return this.instance
}
}
obj.setInstance('name1') // name1
obj.setInstance('name2') // name1
- 创建一个了全局变量,用来当作标识。
- 声明了一个单例对象,内部通过 setInstance 判断 instance 是否存在,如果存在返回之前的对象,确保 一个类仅有一个实例 。
惰性单例
如字面意思,指在需要时才创建对象实例,在调用 obj.setInstance 时才创建 instance,上述已经实现,现在来实现一个简单通用的惰性单例
通用单例
var getFun = function(fn){
let res
return function() { // 闭包函数
return res || (res = fn.apply(this,arguments))
}
}
使用
var divFun = function(){ // 1. 声明一个创建 div 的函数
let div = document.createElement('div')
return div
}
let createDiv = getFun(divFun) // 2. 返回创建div函数
dom.onclick = fucntion(){
createDiv() // 3. 无论点击多少次都只会返回同一个div
}