在JavaScript中实现singleton pattern的最简单/最干净的方法是什么?

推荐答案

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

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

如果你想在你的singleton实例上拥有私有成员,你可以这样做:

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

  function privateMethod () {
    // ...
  }

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

这被称为the 100,它基本上允许您通过利用closures的使用将私有成员封装在对象上.

如果您想要防止修改Singleton对象,您可以使用ES5 Object.freeze方法进行freeze it.

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

如果您使用的是ES6,那么可以很容易地用ES Modules表示一个单例,甚至可以通过在module scope处声明变量来保持private state:

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

function privateFn () {
  // ...
}

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

然后,只需导入singleton对象即可使用它:

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

Javascript相关问答推荐

除了在Angular 16中使用快照之外,什么是可行且更灵活的替代方案?

如何在JavaScript中在文本内容中添加新行

if/else JavaScript中的条件行为

如何解决CORS政策的问题

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

为什么当我解析一个promise时,输出处于挂起状态?

显示图—如何在图例项上添加删除线效果?

无法检测卡片重叠状态的问题

如何将react—flanet map添加到remixjs应用程序

如何控制Reaction路由加载器中的错误状态?

单个HTML中的多个HTML文件

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

JavaScript是否有多个`unfined`?

Puppeteer上每页的useProxy返回的不是函数/构造函数

如何在我的Next.js项目中.blob()我的图像文件?

为什么在函数中添加粒子的速率大于删除粒子的速率?

如何在和IF语句中使用||和&;&;?

ngOnChanges仅在第二次调用时才触发

JSX/React -如何在组件props 中循环遍历数组