在 JavaScript 中实现单例模式

属于「创建型模式」,是「GoF」的 23 种设计模式之一。

保证一个特定类只有一个实例,后续使用同一个类创建对象时应得到与已创建对象完全相同的对象。

实现

全局变量

定义一个全局变量或赋值给全局对象属性:

function initSingleton() {
if (window.SINGLETON_INSTANCE) {
return;
}

window.SINGLETON_INSTANCE = { /* 一些属性或方法 */ };
}

这种方式虽然实现起来最简单,但很轻易就能被外部所修改。

静态属性

将实例缓存在构造函数的静态属性上:

function Singleton() {
if (typeof Singleton.instance === 'object') {
return Singleton.instance;
}

// 往 `this` 上添加属性等

Singleton.instance = this;
}

这种方式同样会比较轻易被外部修改,但与全局变量相比风险稍小。

重写构造函数

重写构造函数:

function Singleton() {
let inst;

Singleton = function Singleton() {
return inst;
}

Singleton.prototype = this;

inst = new Singleton();

inst.constructor = Singleton;

// 往 `inst` 上添加属性等

return inst;
}

这种方式实现起来比较啰嗦,并且反直觉。

闭包

将实例缓存在闭包中:

const Singleton = (function() {
let inst;

return function Singleton() {
if (inst) {
return inst;
}

inst = this;

// 往 `this` 上添加属性等
}
})();

除了会因闭包而产生额外内存开销之外,这种方式应该是最完美的了!

更多