单例就是保证一个类只有一个实例,实现方法先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
① 对象字面量
var singleton = {
attr : 1,
method : function(){ return this.attr; }
}
var t1 = singleton ;
var t2 = singleton ;
t1 === t2 。
简单实用,不足之处在于没有什么封装性,所有的属性方法对外暴露。
② 构造函数
function Construct(){
// 确保只有单例
if( Construct.unique !== undefined ){
return Construct.unique;
}
// 其他代码
this.name = "TRE";
Construct.unique = this;
}
t1 === t2 。
该方式也没有安全性,一旦在外部修改了Construct的unique属性,那么单例模式也就被破坏了。
③ 闭包
var single = (function(){
var unique;
function Construct(){
// ... 生成单例的构造函数的代码
}
unique = new Constuct();
return unique;
})();
只要 每次将 var t1 = single; var t2 = single;即可。 与对象字面量方式类似。不过相对而言更安全一点,当然也不是绝对安全。
如果希望会用调用 single() 方式来使用,那么也只需要将内部的 return 改为
return function(){
return unique;
}
使用数据缓存来存储该单例,用作判断单例是否已经生成,是单例模式主要的实现思路。
本文链接地址: JavaScript 单例模式