javascript私有字段#field仅属声明它的类实例,不继承、不共享、不挂载原型链,不可被外部访问或反射获取,初始化须在类体内或constructor中完成,且需通过受控公有方法封装业务逻辑。

JavaScript 中私有字段(#field)在继承链中不被共享、不被访问、也不被继承——它只属于声明它的那个 class 实例,且运行时强制隔离。
私有字段完全不参与原型链和继承机制
私有字段不是属性,不挂载到实例的属性空间,也不出现在 __proto__ 或 prototype 上。子类即使继承父类,其每个实例都拥有自己独立的一份 #field,同名字段之间毫无关联:
- 父类
A中定义#id = 1,子类B extends A中也写#id = 2,两者互不影响 -
super.#id是语法错误,子类方法中无法通过任何方式读取或修改父类的私有字段 - 私有字段不会被
Object.keys()、for...in、JSON.stringify()或Reflect.ownKeys()捕获
访问控制由语言层硬性保障
私有字段不是靠命名约定或文档约束,而是解析期和运行期双重拦截:
- 外部代码写
obj.#secret,直接抛SyntaxError(解析失败) - 跨实例访问如
inst1.#data在inst2方法中尝试,报TypeError - 试图用
Reflect.get(obj, '#data')或obj['#data']获取,返回undefined或报错,因为该键根本不存在于对象属性表中
初始化与生命周期严格绑定类定义
私有字段必须在类体内声明并初始化,或在 constructor 中首次赋值;未初始化即访问会立即报错:
- ✅ 允许:
class C { #x = 0; constructor() { this.#y = 'ok'; } } - ❌ 禁止:
const c = new C(); c.#z = 1;(语法错误) - ⚠️ 危险:
if (cond) this.#flag = true;可能导致部分实例未初始化就调用 getter,触发 TypeError
真正安全的数据保护靠接口封装,而非字段本身
私有字段只是“锁住数据”,不等于“保护业务逻辑”。要防止误用或越权操作,必须配合受控的公有方法:
- 避免
getSecret() { return this.#secret; }——直接暴露值 - 推荐
verifyToken(token) { return token === this.#secret; }——只暴露判断能力 - 异步场景下,禁止将
this.#data直接赋给全局变量或回调参数,应返回只读副本或结构化结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











