1.核心
单例模式的核心是确保只有一个实例,并提供全局访问。
因此,一个全局变量就可以当成一个单例模式来使用,但是这样容易污染全局空间,可以通过使用命名空间和使用闭包来封装私有变量来减少污染。
//使用立即执行函数和闭包创建出私有变量
var user=(function(){
var name='jc';
return {
print: function(){
console.log(name);
}
};
})();
user.print();
2.惰性单例
惰性单例是指在需要的时候才创建对象实例,例如,页面上的一个单例元素,可以在使用的时候才去创建它,而不是页面加载好的时候就去创建它,或者还可以用无限滚动的思想。
//使用闭包实现私有变量表示单例是否被创建
var createLoginLayer=(function(){
var div;
return function(){
if(!div){
div=document.createElement('div');
document.body.appendChild(div);
}
return div;
}
})();
var login=createLoginLayer();
但是这种实现方式上,违反了单一职责原则,应该将创建一个对象和单例模式分开来实现,有利于代码的复用。因此,需要将不变的单例模式代码抽取出来。
/**
* 创建一个获取单例的函数,传入的fn为创建对象的方法
*/
function getInstance(fn){
var res;
return function(){
if(!res){
res=fn();
}
return res;
}
}
这个实现单例模式的函数,还可以用来使一个有返回值的函数仅执行一次,可以用来保证仅加载一次数据。