我刚刚读了一些关于javascript中单例设计讨论的帖子。我对设计模式是100%的新手,但正如我所看到的,因为单例的定义不需要被实例化,从概念上讲,如果它不被实例化,在我看来,它不需要像从蓝图(类)创建的传统对象一样被对待。所以我想知道,为什么不把单例看作是静态可用的东西,包装在某种范围内,这应该就是全部。
从我看到的线程来看,它们中的大多数都是通过传统的javascript来创建单例的。
new function(){}
然后创建一个伪构造函数。
好吧,我只是认为一个对象字面就足够了:
var singleton = {
dothis: function(){},
dothat: function(){}
}
对吗?或者有人有更好的见解?
更新:再一次,我的观点是,为什么人们不像我在第二个片段中展示的那样,使用更简单的方法在javascript中创建单例,如果有绝对的原因,请告诉我。我通常害怕这种情况,我会把事情简化得太多:D
发布于 2009-12-13 14:07:04
从火狐扩展到网站,我都使用过第二个版本(var singleton = {};
),它工作得非常好。一个好主意是不要在花括号内定义东西,而是在花括号外使用对象的名称,如下所示:
var singleton = {};
singleton.dothis = function(){
};
singleton.someVariable = 5;
发布于 2012-12-08 01:46:17
ES5规范允许我们使用Object.create():
var SingletonClass = (function() {
var instance;
function SingletonClass() {
if (instance == null) {
instance = Object.create(SingletonClass.prototype);
}
return instance;
}
return {
getInstance: function() {
return new SingletonClass();
}
};
})();
var x = SingletonClass.getInstance();
var y = SingletonClass.getInstance();
var z = new x.constructor();
这很好,因为我们不必担心我们的构造函数泄漏,我们仍然总是以相同的实例结束。
这种结构还有一个优点,那就是我们的Singleton只有在需要时才会构造它自己。此外,像我们在这里所做的那样使用闭包可以防止外部代码意外地或以其他方式使用我们的"instance“变量。我们可以在同一个地方构建更多的私有变量,并且我们可以在我们的类原型上定义我们想要公开导出的任何东西。
发布于 2009-12-13 22:51:19
单例模式是通过使用一个方法创建一个类来实现的,该方法在类不存在的情况下创建一个新的实例。如果一个实例已经存在,它只是返回一个对该对象的引用。1
(function (global) {
var singleton;
function Singleton () {
// singleton does have a constructor that should only be used once
this.foo = "bar";
delete Singleton; // disappear the constructor if you want
}
global.singleton = function () {
return singleton || (singleton = new Singleton());
};
})(window);
var s = singleton();
console.log(s.foo);
var y = singleton();
y.foo = "foo";
console.log(s.foo);
您不能仅仅将单例声明为对象,因为这会实例化它,而不是声明它。它也没有提供一种机制,让代码不知道之前对单例的引用来检索它。单例不是由单例返回的对象/类,它是一个结构。这类似于闭包变量不是闭包,提供闭包的函数作用域就是闭包。
https://stackoverflow.com/questions/1895635
复制相似问题