一、单例模式1 (构造函数的静态属性保存实例)
function Universe(){
//如果实例存在则直接返回
if(typeof Universe.instance === 'object')){
return Universe.instance;)
}
this.start_time = 0;
this.bang = 'big';
Universe.instance = this;
return this;
}
//测试
var uni = new Universe();
var uni2 = new Universe();
uni === uni2 //结果为true;
缺点:instance 属性是公开的,可以任意修改
二、单例模式2 (闭包--私有静态成员保存实例--重写构造函数)
function Universe(){
//缓存实例
var instance = this;
this.start_time = 0;
this.bang = 'big';
//重写构造函数
Universe = function(){
return instance;
};
}
//测试
var uni = new Universe();
var uni2 = new Universe();
uni === uni2 //结果为true;
缺点:重写构造函数会造成原型的改变,但返回的引用却是旧构造函数对象的引用,导致丢失初始化后添加的扩展,因为没有指向新构造函数对象的引用
改进: (让实例引用指向新构造函数)
function Universe(){
//缓存实例
var instance ;
//重写构造函数
Universe = function(){
return instance;
};
//保留原型属性\n
Universe.prototype = this;
instance = new Universe();
//重置构造函数指针
instance.constructor = Universe;
//功能
this.start_time = 0;
this.bang = 'big';
}
三、单例模式3( 即时函数,模块模式,私有成员保存实例)
var Universe = (function(){
var instance;
return function(){
if(instance){
return instance;
}
instance = this;
//功能
this.start_time = 0;
this.bang = 'big';
}
})()
个人推荐此种模式,如果需要扩展,则应自行提供扩展接口