在javascript中正确实现单例

时间:2015-07-09 11:25:34

标签: javascript singleton

我在javascript中遇到了单例设计模式的实现。

var Singleton = (function () {
var instance;

function createInstance() {
    var object = new Object("I am the instance");
    return object;
}

return {
    getInstance: function () {
        if (!instance){
            instance = createInstance();
        }
        return instance;
    }
};
})();

接近两个

var singleton = (function(){
var a = { value: "string"};

return {
    getInstance: function(){
                   return a;
                 }
 };
})();
var ob = singleton.getInstance();
var be = singleton.getInstance();
console.log(ob===be); //logs true

所以我的问题是第二种方法是否存在任何问题。

我认为没有必要创建一个函数并让它返回一个对象,而是我们可以简单地创建一个对象并通过getInstance()方法返回它,因为它是IIFE(立即调用函数),所以只有正在创建的对象的一个​​实例,所以我们任何方式都不需要进行以下检查     if(!instance){instance = createInstance()} 宁 我们应该立即调用函数,在该函数中创建一个对象,它将是私有对象,然后通过getInstance方法返回它。

我的问题是:我的理解是正确的还是我错过了一些观点,因此我在javascript中实现了单数错误。

非常感谢

2 个答案:

答案 0 :(得分:1)

这样做的原因

return {
    getInstance: function () {
        if (!instance){
            instance = createInstance();
        }
        return instance;
    }
};

在第一次调用getInstance之前不会创建实例...所以单例可能永远不会被实例化(如果这样做“很贵”,那就好了)

答案 1 :(得分:0)

是第二种方法是正确的。第二种方法没有问题。

人们通过从java扩展它来解释使用第一种方法,java是基于类的语言,我们需要在使用之前实例化对象,

但是在javascript中我们可以简单地使用Object文字创建一个对象,例如它将是单例对象:     var a = {}; 这里是一个单例对象,不能有另一个创建的实例,就像一个。

如果我们希望我们的单例对象具有私有变量和私有方法,我们可以通过问题中提到的SECOND方法。

请参阅以下链接以获得澄清 Simplest/Cleanest way to implement singleton in JavaScript?

javascript singleton question