首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >javascript单例问题

javascript单例问题
EN

Stack Overflow用户
提问于 2009-12-13 13:26:51
回答 8查看 13.6K关注 0票数 19

我刚刚读了一些关于javascript中单例设计讨论的帖子。我对设计模式是100%的新手,但正如我所看到的,因为单例的定义不需要被实例化,从概念上讲,如果它不被实例化,在我看来,它不需要像从蓝图(类)创建的传统对象一样被对待。所以我想知道,为什么不把单例看作是静态可用的东西,包装在某种范围内,这应该就是全部。

从我看到的线程来看,它们中的大多数都是通过传统的javascript来创建单例的。

代码语言:javascript
复制
new function(){} 

然后创建一个伪构造函数。

好吧,我只是认为一个对象字面就足够了:

代码语言:javascript
复制
var singleton = {
   dothis: function(){},
   dothat: function(){}
}

对吗?或者有人有更好的见解?

更新:再一次,我的观点是,为什么人们不像我在第二个片段中展示的那样,使用更简单的方法在javascript中创建单例,如果有绝对的原因,请告诉我。我通常害怕这种情况,我会把事情简化得太多:D

EN

回答 8

Stack Overflow用户

发布于 2009-12-13 14:07:04

从火狐扩展到网站,我都使用过第二个版本(var singleton = {};),它工作得非常好。一个好主意是不要在花括号内定义东西,而是在花括号外使用对象的名称,如下所示:

代码语言:javascript
复制
var singleton = {};
singleton.dothis = function(){

};
singleton.someVariable = 5;
票数 3
EN

Stack Overflow用户

发布于 2012-12-08 01:46:17

ES5规范允许我们使用Object.create():

代码语言:javascript
复制
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“变量。我们可以在同一个地方构建更多的私有变量,并且我们可以在我们的类原型上定义我们想要公开导出的任何东西。

票数 3
EN

Stack Overflow用户

发布于 2009-12-13 22:51:19

单例模式是通过使用一个方法创建一个类来实现的,该方法在类不存在的情况下创建一个新的实例。如果一个实例已经存在,它只是返回一个对该对象的引用。1

代码语言:javascript
复制
(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);

您不能仅仅将单例声明为对象,因为这会实例化它,而不是声明它。它也没有提供一种机制,让代码不知道之前对单例的引用来检索它。单例不是由单例返回的对象/类,它是一个结构。这类似于闭包变量不是闭包,提供闭包的函数作用域就是闭包。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1895635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档