单例模式
单例(Singleton)模式的作用让某一个类始终只拥有一个实例,即每次通过构造函数构造的对象始终是同一个。
var Universe = function () {
// ...
}
new Universe() === new Universe();
单例模式的实现
实例挂载构造函数
var Universe = function () {
// cache命中
if (typeof Universe.instance === 'object') {
return Universe.instance;
}
// main
this.bang = "Big";
// cahce
Universe.instance = this;****
return this;
}
优点:实现简单
缺点:在构造函数上暴露了instance
实例,容易被篡改
重写构造函数
var Universe = function () {
// 缓存
var instance = this;
// main
this.bang = "Big";
// 重写
Universe = function () {
return this;
}
}
优点:没有暴露任何变量
缺点:
- 丢失挂载在原构造函数和原构造函数原型上的属性
- 实例的构造函数不等于现在的构造函数
写成代码就是
var universe = new Universe();
Universe.prototype.everything = true;
console.log(universe.everything); // undefined
universe.constructor === Universe; // false
这和我们预想的结果是不一致的;我们仍然希望单例模式的构造函数拥有一般构造函数的效果;因此这个单例模式仍然要继续优化,这次优化主要是放在原型问题上。我们这么做:
var Universe = function () {
// 缓存
var instance;
// 重写
Universe = function () {
return instance;
}
// 补充原型
Universe.prototype = this;
// 构造实例
instance = new Universe();
// 重置构造函数
instance.constructor = Universe;
// main
this.bang = "Big";
return instance;
}
闭包
如果要全程维护唯一实例的生命周期,那么采用闭包应该才是最合适的方式。
var Universe = (function () {
var instance;
return function () {
if (instance) {
return instance;
}
instance = this;
// main
this.bang = "Big";
}
})();
网友评论