在 JavaScript 中实现单例的最简单/最干净的方法

新手上路,请多包涵

在 JavaScript 中实现 单例模式 的最简单/最干净的方法是什么?

原文由 Jakub Arnold 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

我认为最简单的方法是声明一个简单的对象文字:

 var myInstance = {
 method1: function () {
 // ...
 },
 method2: function () {
 // ...
 }
 };

如果你想要你的单例实例上的私有成员,你可以这样做:

 var myInstance = (function() {
 var privateVar = '';

 function privateMethod () {
 // ...
 }

 return { // public interface
 publicMethod1: function () {
 // All private members are accessible here
 },
 publicMethod2: function () {
 }
 };
 })();

这被称为 _模块模式_,它基本上允许您通过使用 闭包 将私有成员封装在对象上。

如果你想阻止修改单例对象,你可以 _冻结它_,使用 ES5 Object.freeze 方法。

这将使对象不可变,防止对其结构和值进行任何修改。

如果你使用 ES6,你可以很容易地使用 ES 模块 来表示一个单例,你甚至可以通过在 模块范围内 声明变量来保持 _私有状态_:

 // my-singleton.js
 const somePrivateState = []

 function privateFn () {
 // ...
 }

 export default {
 method1() {
 // ...
 },
 method2() {
 // ...
 }
 }

然后你可以简单地导入单例对象来使用它:

 import myInstance from './my-singleton.js'
 // ...

原文由 Christian C. Salvadó 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为最干净的方法是这样的:

 var SingletonFactory = (function(){
    function SingletonClass() {
        //do stuff
    }
    var instance;
    return {
        getInstance: function(){
            if (instance == null) {
                instance = new SingletonClass();
                // Hide the constructor so the returned object can't be new'd...
                instance.constructor = null;
            }
            return instance;
        }
   };
})();

之后,您可以调用该函数

var test = SingletonFactory.getInstance();

原文由 sebarmeli 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题