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现在是一个对象.
有趣的问题,我会尝试猜测。
我看到有几个原因:
首先是@Steffomio 在评论中指出的。
第一个版本仅在第一次使用时实例化,而第二个版本将立即实例化,这可能会导致页面加载时的 CPU 压力(通常会产生不良影响)
第二个在这里:
if (!instance) {
instance = createInstance();
}
return instance;
Run Code Online (Sandbox Code Playgroud)代码的一部分。
使用您的代码版本(简单的闭包评估),如果单例的脚本在网页中嵌入多次,则可能会失败。
第一次创建单例时,某行代码对其进行了修改,然后另一行代码重新创建了单例,之前的修改将丢失。
第三个原因是许多语言无法像 JavaScript 那样轻松地表达自动求值函数。如果您了解如何在 C# 中实现单例,您会发现类似的模式,它可能经常被翻译为 JavaScript 中的形式。
正如您自己所说,最后一个原因是继承支持。
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |