javascript - 为什么 Javascript Singleton 是这样写的?

标签 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;
        }
    };
})();

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

var Singleton = (function () {

    function privateMethod() {
        ...
    }

    return {
        publicMethod1: function() { },
        publicMethod2: function() { },
    };
})();

有人会说原因是为了支持继承。但是,我看不出有什么区别。不管怎样,Singleton 现在是一个对象。

最佳答案

有趣的问题,我来猜一猜。

我看到几个原因:

  • 首先由@Steffomio 在评论中指出。
    第一个版本只会在第一次使用时实例化,而第二个版本会立即实例化,这可能会导致页面加载时 CPU 压力(通常是不希望的结果)

  • 第二个在这里:

     if (!instance) {
            instance = createInstance();
        }
        return instance;
    

部分代码。

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

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

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

关于javascript - 为什么 Javascript Singleton 是这样写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37254353/

相关文章:

javascript - 使用 gulp 展平父目录但不展平子目录

design-patterns - 您是否在具有闭包/委托(delegate)/函数指针的编程语言中使用模板方法模式?

javascript - 使用不同的参数调用 javascript 函数,具体取决于我所在的页面

javascript - Dropbox 图像短网址

javascript - jQuery 不会在第一次之后再替换

javascript - 禁用 Jest setTimeout 模拟

c# - 工厂模式应该放在 DDD 中的什么位置?

c# - 条件生成器方法链接 Fluent 接口(interface)

java - 什么样的设计模式适合我的需要?

c++ - 是否有一个类存储另一个类所需信息的设计模式,例如它的构造?