ES6类可通过静态属性和方法实现单例模式:用静态属性instance保存唯一实例,构造函数中检查并抛错,提供getInstance()统一获取;支持传参的懒初始化需首次调用时配置并创建,后续忽略参数。

ES6 类本身不直接支持单例模式,但可以通过静态属性和方法在类内部控制实例创建,确保全局只有一个实例。
用静态属性保存唯一实例
核心思路是把实例存在类的静态属性里,每次调用构造函数前先检查是否已有实例。如果有,直接返回;没有才新建。
- 静态属性(如 instance)属于类本身,所有实例共享
- 构造函数中判断 MyClass.instance 是否存在,存在则抛出错误或直接返回(推荐前者,避免意外复用)
- 提供一个静态方法(如 getInstance())统一获取实例,更符合单例习惯
标准实现写法
以下是一个安全、可读性强的写法:
class Logger {
constructor() {
if (Logger.instance) {
throw new Error('Logger is a singleton. Use Logger.getInstance() instead.');
}
Logger.instance = this;
// 初始化逻辑放这里,比如打开日志文件、设置格式等
}
static getInstance() {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
log(message) {
console.log(`[LOG] ${message}`);
}
}
// 使用方式
const logger1 = Logger.getInstance();
const logger2 = Logger.getInstance();
console.log(logger1 === logger2); // true
注意构造函数私有化(可选但推荐)
虽然 JavaScript 没有真正的私有构造函数,但可通过约定+运行时检查防止外部 new:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 不暴露构造函数调用,只通过 getInstance() 获取实例
- 在构造函数开头加检查,阻止重复 new(如上例中的 throw)
- 文档注明“禁止直接 new”,配合团队规范使用
扩展:支持传参的懒初始化单例
如果需要首次初始化时传配置,可在 getInstance(config) 中处理:
- 首次调用时保存 config 并初始化
- 后续调用忽略参数,直接返回已有实例
- 避免多次初始化导致状态冲突
例如:不要在 getInstance 里每次都 new,而是只在 instance 为空时 new,并把 config 存到实例上。

















