在 ES2024 中,我们可以利用类(class)、私有字段和静态方法来实现一个更加优雅和安全的单例模式。
class Singleton {
static #instance = null;
#data;
constructor() {
if (Singleton.#instance) {
return Singleton.#instance;
}
this.#data = new Map();
Singleton.#instance = this;
}
static getInstance() {
if (!Singleton.#instance) {
Singleton.#instance = new Singleton();
}
return Singleton.#instance;
}
set(key, value) {
this.#data.set(key, value);
}
get(key) {
return this.#data.get(key);
}
}
// 使用示例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // 输出: true
instance1.set('name', 'John');
console.log(instance2.get('name')); // 输出: John
实现思路
- 静态私有字段
#instance: 用于存储单例实例,确保外部无法直接访问或修改。 - 构造函数检查: 在构造函数中检查实例是否已经存在,如果存在则返回该实例,从而确保只创建一个实例。
- 静态方法
getInstance(): 提供全局访问点,通过此方法确保只创建一个实例。 - 私有字段
#data: 用于存储数据,防止外部直接访问和修改数据。 - 数据操作方法: 提供
set和get方法来操作内部数据,确保数据访问的控制和一致性。
优点
- 线程安全: JavaScript 是单线程的,这种实现保证多次调用时只有一个实例。
- 延迟初始化: 单例实例仅在第一次使用时被创建。
- 封装性好: 利用私有字段,防止外部直接访问和修改内部状态。