定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
如:登陆弹窗,全局只有唯一的一个实例。
var CreateDiv=function(html){
this.html=html
this.init()
}
CreateDiv.prototype.init=function(){
var div=document.createElement('div')
div.innerHTML=this.html
document.body.appendChild(div)
}
// 上面的类仅有创建一个div的功能
// 使用代理类来实现单例模式
var ProxySingletonCreateDiv=(function(){
var instance
return function(html){
if(!instance){
instance=new CreateDiv(html)
}
return instance
}
})() // new对构造函数的调用行为,如果函数不返回一个对象则new出一个实例对象,如果返回对象则new出这个对象
var a=new ProxySingletonCreateDiv('a')
var b=new ProxySingletonCreateDiv('b')
console.log(a===b) // true
js中的单例模式
单例模式的核心是确保只有一个实例,并提供全局访问。
全局变量可以作为单例模式来使用,但是潜在问题较多。
使用命名空间可以减少全局变量的数量,感觉框架下一个文件也是一个命名空间。
惰性单例
惰性单例指的是在需要的时候才创建出对象实例。
惰性指在被使用的时候才被创建出来,是从时间维度上对程序运行时间的合理配置。
单一职责原则
一个方法只实现一种逻辑。
var getSingleton=function(fn){ //负责管理单例的逻辑,传参fn只负责创建实例
var result
return function(){
return result||result=fn.apply(this,arguments)
}
} // 也可以利用该函数来实现一些只执行一次的行为,本质上这个函数就是控制一个过程只执行一次
var fn=function(){
// some action
return true // 或者得到的实例对象
}
将创建对象和管理单例的职责逻辑分离为两种方法