單例模式
單例(Singleton)模式的作用讓某一個(gè)類始終只擁有一個(gè)實(shí)例藐守,即每次通過構(gòu)造函數(shù)構(gòu)造的對(duì)象始終是同一個(gè)赦政。
var Universe = function () {
// ...
}
new Universe() === new Universe();
單例模式的實(shí)現(xiàn)
實(shí)例掛載構(gòu)造函數(shù)
var Universe = function () {
// cache命中
if (typeof Universe.instance === 'object') {
return Universe.instance;
}
// main
this.bang = "Big";
// cahce
Universe.instance = this;****
return this;
}
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單
缺點(diǎn):在構(gòu)造函數(shù)上暴露了instance
實(shí)例撬讽,容易被篡改
重寫構(gòu)造函數(shù)
var Universe = function () {
// 緩存
var instance = this;
// main
this.bang = "Big";
// 重寫
Universe = function () {
return this;
}
}
優(yōu)點(diǎn):沒有暴露任何變量
缺點(diǎn):
- 丟失掛載在原構(gòu)造函數(shù)和原構(gòu)造函數(shù)原型上的屬性
- 實(shí)例的構(gòu)造函數(shù)不等于現(xiàn)在的構(gòu)造函數(shù)
寫成代碼就是
var universe = new Universe();
Universe.prototype.everything = true;
console.log(universe.everything); // undefined
universe.constructor === Universe; // false
這和我們預(yù)想的結(jié)果是不一致的铲觉;我們?nèi)匀幌M麊卫J降臉?gòu)造函數(shù)擁有一般構(gòu)造函數(shù)的效果窝稿;因此這個(gè)單例模式仍然要繼續(xù)優(yōu)化,這次優(yōu)化主要是放在原型問題上访忿。我們這么做:
var Universe = function () {
// 緩存
var instance;
// 重寫
Universe = function () {
return instance;
}
// 補(bǔ)充原型
Universe.prototype = this;
// 構(gòu)造實(shí)例
instance = new Universe();
// 重置構(gòu)造函數(shù)
instance.constructor = Universe;
// main
this.bang = "Big";
return instance;
}
閉包
如果要全程維護(hù)唯一實(shí)例的生命周期瞧栗,那么采用閉包應(yīng)該才是最合適的方式。
var Universe = (function () {
var instance;
return function () {
if (instance) {
return instance;
}
instance = this;
// main
this.bang = "Big";
}
})();