单体(单例)模式的实现在于保证一个特定类仅有一个实例,意味着当第二次使用同一个类创建新对象时,应该得到第一个所创建对象完全相同对象。
new操作符:
单体思想是,当使用同一个构造函数以new操作符来创建多个对象时,应该仅获得指向完全相同的对象的新指针。
实现方法:
1、可以使用全局变量来存储该实例,但是并不推荐使用这种方法,因为在一般原则下,全局变量是有确定啊的,此外,任何人都能f覆盖该全局变量,即使是意外事件。
2、可以在构造函数的静态属性中缓存该实例。js的函数也是对象,因为他们也可以有属性。可以设置一个属性并将实例缓存到这个实例中。但唯一的缺点是:该静态属性是公开可访问的的属性,在外部代码中可能会修改该属性。
3、可以将实例包装到闭包中,这样可以保证该实例的私有性并且保证该实例不会被构造函数之外的代码所修改,代价是会带来额外的闭包开销。
下面,我们看看第二种和第三种的实现:
静态属性中的实例:
function Univerce(){
// 我们有一个现有的实例吗?
if(typeof Univerce.instance==="object"){
return Univerce.instance;
}
// 正常进行
this.start_time=0;
this.bang="big";
// 缓存
Univerce.instance=this;
return this;
}
// 测试
var uni=new Univerce();
var uni2=new Univerce();
console.log(uni==uni2) //true
缺点是:该静态属性是公开可访问的的属性,在外部代码中可能会修改该属性。
闭包中的实例:
var Universe;
(function(){
var instance;
Universe=function Universe(){
if(instance){
return instance;
}
instance=this;
// 所有功能
this.start_time=0;
this.bang="big";
}
})();
var uni=new Universe();
var uni1=new Universe();
console.log(uni1)
console.log(uni==uni1)
带来额外的闭包开销。