单例模式,唯一对象,js没有类的概念,只有对象,每个对象就相当于一个单例
var singleton = {
name: 'll',
getName: function(){
return this.name
}
}
var a = singleton
var b = singleton
console.log(a === b) //true
上面的例子相当于一个单例, 变量a、b指向同一个实例;但singleton构造函数是Object,singleton不是Object构造函数的唯一实例
使用构造函数
function Singleton(name) {
this.name = name;
this.instance = null;
this.getName = function(){
return this.name
};
}
Singleton.getInstance = function(name){
if(!this.instance){
this.instance = new Singleton(name)
}
return this.instance
}
var a = Singleton.getInstance('aa')
var b = Singleton.getInstance('bb')
console.log(a === b)
a和b指向同一对象,且该对象是Singleton构造函数的唯一实例,
在使用getInstance()获取单例时判断单例是否已创建,若创建直接返回,若未创建,new一个并返回。
上面使用Singleton.getInstance()来获取单例,增加不透明性,下面使用new来获取单例
var Singleton = (function(){
var instance;
var Singleton = function(name){
if(instance){
return instance
}
this.name = name
return instance = this
}
return Singleton
})()
var a = new Singleton('aa')
var b = new Singleton('bb')
console.log(a === b)
这里使用闭包内变量instance保存实例,使用立即执行函数返回一个构造函数Singleton,在构造函数内判断实例是否存在,若存在,直接返回若不存在 new一个对象