在JavaScript中实现单例模式的最简单/最干净的方法是什么?
我认为最简单的方法是声明一个简单的对象文字:
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。
Object.freeze
这将使对象不可变,从而防止对其结构和值进行任何修改。
另外,我想提到的是,如果您使用的是ES6,则可以很容易地使用ES模块表示一个单例,甚至可以通过在 模块作用域中声明变量来保持私有状态:
// my-singleton.js const somePrivateState = [] function privateFn () { // ... } export default { method1() { // ... }, method2() { // ... } }
然后,您可以简单地导入单例对象以使用它:
import myInstance from './my-singleton.js' // ...