我到处都看到以这种方式在 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/