javascript - Javascript 中的单例和原型(prototype)设计

标签 javascript oop singleton prototype

我只是在研究在 JavaScript 中定义单例的方法,在研究了一些示例之后,我想到了以下我在任何地方都没有找到的方法:

function MyClass() {
   if (MyClass._sharedInstance === undefined) {
      // actual constructor code

      MyClass._sharedInstance = this;
   }
   return MyClass._sharedInstance;
}

MyClass._sharedInstance = undefined;

看起来工作正常...但事实上我在任何地方都找不到这个让我很怀疑。有什么理由不这样做单例,特别是考虑到 JavaScript 的许多小陷阱。我知道通过简单地执行 var MyClass = {/* MyClass Stuff */} 我可以用更少的代码实现单例,但为了保持一致性,我想使用原型(prototype)定义所有类.

最佳答案

提议的解决方案似乎没有“解决”任何问题1;像这样, 我推荐使用惯用的“简单模块模式”的标准变体 IIFE :

MySingleton = (function () {
    // This function is only executed once
    // and whatever is returned is the singleton.
    return {
       // Expose members here
    };
})();

根据具体需要,还可以返回新的对象,从而使该模式变得灵活,而无需引入单独的“单例”字段和保护,例如

MySingleton = (function () {
    // Contrived, but valid - any object returned
    // functions as the singleton.
    function MyClass {}
    return new MyClass();
})();
<小时/>

1如果有的话,它可能会导致一些“WTF?”当 new MyClass() 返回一个共享/单例对象时,这不是“正常”行为。

关于javascript - Javascript 中的单例和原型(prototype)设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174141/

相关文章:

ios - iOS 中的多个委托(delegate)

javascript - 如何让一个函数仅在另一个函数完全启动后才启动?

javascript - this.helpers 中的箭头函数

c++ - 无法将字符串参数传递给派生类成员函数 C++

c++ - C++中的静态和动态解析

c++ - 需要 Qt 架构建议

javascript - 如何让我的 HTML 按钮调用我的 Javascript?

javascript - 仅在 Firefox (JQuery) 文本字段的开始和结束时不触发按键事件

java - 在子类对象java上调用父类的方法

c++ - 引用单例是在栈上还是在堆上?