js实现单例模式
单例模式的基本概念
单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。在JavaScript中,可以通过多种方式实现单例模式。
使用对象字面量
最简单的单例实现方式是直接使用对象字面量。由于对象字面量在JavaScript中本身就是单例,无需额外处理。

const singleton = {
property: 'value',
method() {
console.log('Method called');
}
};
使用闭包和立即执行函数
通过闭包和立即执行函数(IIFE)可以隐藏实例并控制其创建过程。

const Singleton = (function() {
let instance;
function createInstance() {
return {
property: 'value',
method() {
console.log('Method called');
}
};
}
return {
getInstance() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true
使用ES6类
结合ES6的类和静态方法,可以更清晰地实现单例模式。
class Singleton {
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
this.property = 'value';
Singleton.instance = this;
}
method() {
console.log('Method called');
}
}
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true
使用模块系统
在现代JavaScript中,模块系统天然支持单例模式。一个模块只会被加载一次,导出的对象就是单例。
// singleton.js
let instance = null;
export default class Singleton {
constructor() {
if (instance) {
return instance;
}
this.property = 'value';
instance = this;
}
method() {
console.log('Method called');
}
}
// 使用
import Singleton from './singleton.js';
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true
注意事项
单例模式在全局状态下可能带来一些问题,如测试困难、隐藏的依赖关系等。应根据实际需求谨慎使用。






