一尘不染

在JavaScript中实现单例的最简单/最简洁的方法?

javascript

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


阅读 234

收藏
2020-04-25

共1个答案

一尘不染

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

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'
// ...
2020-04-25