Symbol 实现单例模式的核心是利用其唯一性和不可枚举性隔离实例引用防止外部篡改或重复创建通过 Symbol 键缓存实例如静态属性或 WeakMap并用 Object.defineProperty 锁定私有状态字段但 Symbol 仅提供命名隔离非绝对私有。用 Symbol 实现单例模式的属性锁定核心是利用其唯一性和不可枚举性防止外部篡改或重复创建实例。关键不在“锁住属性”而在于“隔离实例引用”——让构造函数只能返回同一个对象且该对象的关键字段如私有状态不被外部覆盖或遍历。用 Symbol 作为私有实例缓存键将单例实例存在闭包或全局弱映射中但用 Symbol 作键可避免被 for...in、Object.keys() 等枚举到也不与字符串键冲突在类外部声明一个 Symbol用于存储唯一实例 构造函数检查该 Symbol 对应的值是否存在若已存在直接返回不再新建 实例本身不暴露该 Symbol外部无法通过点语法或方括号访问除非拿到 Symbol 引用示例const INSTANCE Symbol(singletonInstance);class Logger { constructor() { if (Logger[INSTANCE]) { return Logger[INSTANCE]; } Logger[INSTANCE] this; this.logCount 0; } log(msg) { console.log([${this.logCount}] ${msg}); }}配合 WeakMap 实现更安全的实例绑定直接挂载在类上如 Logger[INSTANCE]虽简单但存在被手动删除或覆盖的风险。用 WeakMap Symbol 可进一步解耦用 Symbol 作为 WeakMap 的键标识符仅作逻辑区分实际仍用 WeakMap 的 set/get 把类本身作为 WeakMap 的键实例作为值确保每个类独享单例 WeakMap 的键必须是对象且不阻止垃圾回收比静态属性更健壮改进写法const INSTANCE_KEY Symbol(instanceKey);const instances new WeakMap();class Database { constructor() { if (instances.has(this.constructor)) { return instances.get(this.constructor); } instances.set(this.constructor, this); this.connected false; } connect() { this.connected true; }}防止原型/实例属性被意外覆盖单例对象的内部状态如 this._cache容易被外部赋值覆盖。可用 Symbol 命名私有字段并配合 Object.defineProperty 锁定 Mokker AI AI产品图添加背景