JavaScript 中 class 语法中单例模式怎么实现
在 javascript 的 class 语法中,实现单例模式最标准且安全的方法是将构造函数设为私有(使用 # 前缀),并提供一个静态方法用于获取唯一实例。这样做可以防止外部通过 new 关键字创建新对象,同时利用闭包或静态属性缓存实例,确保全局只有一个实例存在。

如何防止外部直接实例化 Class
要阻止外部代码随意调用 new Singleton(),必须将构造函数标记为私有。在 ES2022 引入的私有字段语法中,只需在 constructor 前加上 # 符号即可。当外部尝试实例化时,引擎会抛出 TypeError,从而从语言层面保证了单例的唯一性。

class Singleton {
static instance;
// 私有构造函数
#constructor() {
console.log('Singleton initialized');
}
// 静态访问器
static getInstance() {
if (!this.instance) {
this.instance = new Singleton();
}
return this.instance;
}
}
// 测试
const s1 = Singleton.getInstance();
try {
const s2 = new Singleton(); // 报错: Private field '#constructor' must be set through
} catch (e) {
console.error(e.message);
}如何处理多线程环境下的并发问题
虽然 JavaScript 是单线程的,但在某些异步场景或 Web Worker 环境中,可能需要更严格的同步控制。不过,对于标准的浏览器或 Node.js 环境,由于事件循环机制,上述静态方法中的检查已经是原子的。如果需要模拟更复杂的初始化逻辑,可以在 getInstance 中加入锁机制,但通常简单的 if (!instance) 判断已足够满足绝大多数单例需求。
立即学习“Java免费学习笔记(深入)”;

// 增强版:支持延迟初始化和简单锁
class RobustSingleton {
static instance = null;
static lock = false;
#constructor() {
this.data = [];
}
static getInstance() {
if (RobustSingleton.lock) {
return RobustSingleton.instance;
}
RobustSingleton.lock = true;
try {
if (!RobustSingleton.instance) {
RobustSingleton.instance = new RobustSingleton();
}
} finally {
RobustSingleton.lock = false;
}
return RobustSingleton.instance;
}
}
const r1 = RobustSingleton.getInstance();
const r2 = RobustSingleton.getInstance();
console.log(r1 === r2); // true


















