为什么Javascript Singleton是这样编写的?

Nur*_*lyk 5 javascript design-patterns

无处不在我以这种方式在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;
        }
    };
})();
Run Code Online (Sandbox Code Playgroud)

在这里我们可以看到它返回一个函数,我们必须调用它来获取一个对象.问题:为什么我们不能这样写:

var Singleton = (function () {

    function privateMethod() {
        ...
    }

    return {
        publicMethod1: function() { },
        publicMethod2: function() { },
    };
})();
Run Code Online (Sandbox Code Playgroud)

有人会说理由是继承支持.但是,我没有看到任何区别.无论如何,Singleton现在是一个对象.

Reg*_*lez 2

有趣的问题,我会尝试猜测。

我看到有几个原因:

  • 首先是@Steffomio 在评论中指出的。
    第一个版本仅在第一次使用时实例化,而第二个版本将立即实例化,这可能会导致页面加载时的 CPU 压力(通常会产生不良影响)

  • 第二个在这里:

     if (!instance) {
            instance = createInstance();
        }
        return instance;
    
    Run Code Online (Sandbox Code Playgroud)

代码的一部分。

使用您的代码版本(简单的闭包评估),如果单例的脚本在网页中嵌入多次,则可能会失败。
第一次创建单例时,某行代码对其进行了修改,然后另一行代码重新创建了单例,之前的修改将丢失。

  • 第三个原因是许多语言无法像 JavaScript 那样轻松地表达自动求值函数。如果您了解如何在 C# 中实现单例,您会发现类似的模式,它可能经常被翻译为 JavaScript 中的形式。

  • 正如您自己所说,最后一个原因是继承支持。