ES6私有字段用#前缀声明,是编译期锁定的语法级封装机制;必须在类体中声明,仅同类内部可访问,外部访问抛错,不参与枚举与序列化。

ES6 Class 的私有字段用 # 前缀声明,是真正受语言级保护的封装机制——外部无法读取、修改、枚举,也无法通过反射或字符串拼接绕过。它不是命名约定,也不是闭包模拟,而是编译期就锁定访问权限的语法特性。
声明与访问规则
私有字段必须在类体中直接声明(不能动态生成),且只能在同一个类的内部方法中访问:
-
# 开头 + 合法标识符,例如
#token、#expiresAt、#_cache(注意:#_cache中的下划线只是名字一部分,不表示“半私有”) - 构造函数、实例方法、静态方法里可自由读写
this.#field或ClassName.#staticField - 外部访问
inst.#field会立即抛出SyntaxError(严格模式下)或TypeError(运行时) - 不会出现在
Object.keys()、for...in、JSON.stringify()中,也不被Reflect.ownKeys()返回
典型安全封装场景:本地存储管理器
用私有字段隔离敏感配置和原始数据结构,只暴露可控接口:
class StorageManager {
#key;
#default;
#period;
<p>constructor(key, defaultValue = null, expiryMinutes = 60) {
this.#key = key;
this.#default = defaultValue;
this.#period = expiryMinutes <em> 60 </em> 1000; // 转为毫秒
}</p><p>get key() { return this.#key; } // 只读 getter,不开放 setter</p><p>save(value) {
const payload = {
data: value,
timestamp: Date.now(),
expiresAt: Date.now() + this.#period
};
localStorage.setItem(this.#key, JSON.stringify(payload));
}</p><p>load() {
const item = localStorage.getItem(this.#key);
if (!item) return this.#default;</p><pre class="brush:php;toolbar:false;">try {
const { data, expiresAt } = JSON.parse(item);
return expiresAt > Date.now() ? data : (this.clear(), this.#default);
} catch {
this.clear();
return this.#default;
}
}
clear() { localStorage.removeItem(this.#key); } }
这里 #key、#default、#period 全部不可被外部篡改,使用者只能调用 save()、load()、clear(),保证行为一致性和数据安全性。
常见误区提醒
-
不能用字符串拼接访问:
this['#' + 'key']无效,语法错误 -
不能在子类中直接访问父类私有字段:即使继承,
super.#field不合法,必须通过父类公开方法间接操作 -
私有静态字段需显式声明为 static:
static #VERSION = '1.2.0';,否则是实例私有字段 -
不支持私有 getter/setter 简写:只能写完整方法,如
get #value() { ... }是非法的;正确写法是普通私有方法或公有 getter 封装私有字段
兼容性与替代方案
现代环境(Node.js 12+、Chrome 74+、Firefox 90+、Safari 14.1+)已原生支持 # 语法。若需兼容旧环境,可用 WeakMap 模拟:
const privateData = new WeakMap();
<p>class LegacyStorage {
constructor(key) {
privateData.set(this, { key, storage: localStorage });
}</p><p>save(value) {
const { key } = privateData.get(this);
localStorage.setItem(key, String(value));
}
}</p>
但 WeakMap 方案无编译期检查,且每个实例额外持有一个引用,不如 # 字段简洁可靠。











