Sha*_*awn 19 javascript singleton
我刚刚在javascript中讨论了单例设计的几个主题.我是100%新设计模式的东西,但正如我所看到的,因为根据定义,Singleton不需要实例化,概念上如果它不被实例化,在我看来它不必被视为从蓝图(类)创建的常规对象.所以我的奇怪是为什么不仅仅考虑一个单独的东西,就像静态可用的东西,包含在某种范围内,应该是全部.
从我看到的主题,他们中的大多数通过传统的javascript制作单身
new function(){}
Run Code Online (Sandbox Code Playgroud)
然后创建一个伪构造函数.
我只是觉得一个对象字面就足够了:
var singleton = {
dothis: function(){},
dothat: function(){}
}
Run Code Online (Sandbox Code Playgroud)
对?或者任何人都有更好的见解?
[更新]:我的观点再次表明,为什么人们只是使用更简单的方法在javascript中制作单身,就像我在第二个片段中所示,如果有绝对的原因请告诉我.我经常害怕这种情况,我简化了很多事情:D
CMS*_*CMS 31
我同意你的观点,最简单的方法是使用对象文字,但如果你想要私有成员,你可以实现利用闭包:
var myInstance = (function() {
var privateVar;
function privateMethod () {
// ...
}
return { // public interface
publicMethod1: function () {
// private members can be accessed here
},
publicMethod2: function () {
// ...
}
};
})();
Run Code Online (Sandbox Code Playgroud)
关于new function(){}构造,它将简单地使用匿名函数作为a constructor function,该函数内的上下文将是将返回的新对象.
编辑:为了回应@ J5的评论,这很简单,实际上我认为这可以成为使用延迟函数定义模式的一个很好的例子:
function singleton() {
var instance = (function() {
var privateVar;
function privateMethod () {
// ...
}
return { // public interface
publicMethod1: function () {
// private members can be accessed here
},
publicMethod2: function () {
// ...
}
};
})();
singleton = function () { // re-define the function for subsequent calls
return instance;
};
return singleton(); // call the new function
}
Run Code Online (Sandbox Code Playgroud)
当第一次调用该函数时,我创建了对象实例,并重新分配singleton给一个新函数,该函数在其闭包中具有该对象实例.
在第一次调用结束之前,我执行singleton将返回创建的实例的重新定义的函数.
对singleton函数的调用将简单地返回instance存储在其闭包中的函数,因为新函数是将要执行的函数.
您可以通过比较返回的对象来证明:
singleton() == singleton(); // true
Run Code Online (Sandbox Code Playgroud)
仅当两个操作数的对象引用相同时==,对象的运算符才会返回,即使对象相同但它们是两个不同的实例,它也将返回false:true
({}) == ({}); // false
new Object() == new Object(); // false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13253 次 |
| 最近记录: |