JavaScript 单例模式

单例就是保证一个类只有一个实例,实现方法先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在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 单例模式

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注