私有字段是 es2022 正式标准化的硬封装机制,仅限类体内以 # 开头声明,外部无法访问、探测或绕过,不参与枚举、序列化与继承,支持私有方法/静态成员,兼顾安全与引擎优化。

JavaScript 中的 # 私有字段是 ES2022(ES13)正式标准化的语法特性,它不是模拟、不是约定,而是由语言引擎在语法解析和运行时双重保障的真正封装机制——外部代码既无法访问,也无法探测、反射或绕过。
语法必须显式声明,且仅限类体内使用
私有字段以 # 开头,必须在类体顶层直接声明,不能动态添加,也不能在方法内部创建:
- ✅ 正确写法:
#count = 0;或#name;(可选初始化) - ✅ 只能在构造函数、实例方法、getter/setter、静态方法中通过
this.#xxx访问(静态字段用ClassName.#xxx) - ❌ 错误写法:
obj.#count、this['#' + 'count']、Reflect.get(obj, '#count')—— 全部报SyntaxError或TypeError - ❌ 不支持解构:
const { #count } = obj;语法错误
封装性是硬性的,不是“靠自觉”
与 _prefix 约定、Symbol 属性或 WeakMap 模拟不同,# 字段从设计上就杜绝了所有外部触达路径:
- 不参与
for...in、Object.keys()、Object.getOwnPropertyNames(),甚至Reflect.ownKeys()都看不到它 -
JSON.stringify()自动忽略,Object.assign()不复制,in操作符返回false - 子类完全无法继承或访问父类的 # 字段——不是“受保护”,而是对该子类而言,该字段根本不存在
- 同名字段在父子类中互为独立,
class Child extends Parent { #id }中的#id和父类的#id毫无关系
支持私有方法与静态形态,构成完整封装单元
私有字段天然配合私有方法(#validate()、#cacheKey() 等),把校验、转换、副作用等逻辑收束在类内部:
- 私有方法只能被同一类的其他方法调用,不可被子类重写或外部调用
- 支持静态私有字段(
static #cache = new Map();)和静态私有方法,用于跨实例共享但需隔离的状态 - 私有 getter/setter 也受保护:
get #length() { return this.#data.length; },外部仍需通过公有接口访问
引擎友好,兼顾安全与性能
私有字段不仅强化封装,还为 JavaScript 引擎提供了优化机会:
- 字段位置在类定义时即固定,引擎可做静态分析,避免动态属性查找开销
- 不参与原型链查找,访问速度接近普通属性,支持内联缓存(IC)优化
- 没有闭包作用域绑定或 WeakMap 引用管理的 GC 压力,内存更轻量
- 所有访问都在编译期可静态判定,无需运行时代理拦截
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











