在 javascript 中正确实现单例

Proper implementation of singleton in javascript

我在 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

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

我认为没有必要创建一个函数并让它return一个对象,而是我们可以简单地创建一个对象并通过getInstance()方法return它,因为它是IIFE(immediately invoked function),被创建的对象只有一个实例,所以我们无论如何都不需要进行以下检查 如果(!实例){实例= createInstance()} 相当 我们应该立即调用函数,在该函数中创建一个对象,它将是私有对象,然后 return 通过 getInstance 方法创建它。

我的问题是:我的理解是否正确,或者我遗漏了一些要点,因此在 javascript.

中实现单数是错误的

非常感谢

这样做的原因

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

在第一次调用 getInstance 之前不会创建实例...因此可能永远不会实例化单例(如果 "epensive" 这样做很好)

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

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

但是在java脚本中,我们可以简单地使用对象字面量创建一个对象,它将是单例对象,例如: 变量 a = { }; 这里 a 是单例对象,不能有另一个像 a.

这样的 created 实例

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

请查看以下链接进行说明 Simplest/Cleanest way to implement singleton in JavaScript?

javascript singleton question