一、單例模式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';
}
})()
個人推薦此種模式,如果需要擴展,則應自行提供擴展接口