私有字段#是实例级专属数据,同一类的实例方法可通过this.#fieldName直接访问,无需传参或返回值;子类无法访问父类同名私有字段;私有方法可协作封装逻辑;不支持静态私有字段。

私有字段 # 本身不是“在方法间共享”的资源,而是绑定到每个实例上的专属数据——它天然就在同一个类的所有实例方法中可访问。关键在于:只要方法属于同一类,且写在类体内,就能直接通过 this.#fieldName 读写该私有字段。
同一类的实例方法之间自然可访问
类中所有定义在顶层的方法(包括构造函数、普通实例方法、getter/setter)都运行在同一个词法作用域内,能自由访问本类声明的私有字段:
-
不需要额外传参或返回值:比如
increment()修改this.#count,getCount()直接读取它,无需中间变量传递 - 不依赖闭包或 WeakMap:不像旧方案需要手动维护映射关系,# 字段由引擎自动绑定到实例
-
子类无法访问父类的 # 字段:即使重名,子类里的
#count是全新字段,与父类无关
私有方法也能参与协作
私有方法以 #methodName() 形式定义,只能被同一类的其他方法调用,适合封装复用逻辑:
- 例如把校验、格式化、日志等通用操作抽成
#validate()或#formatData() - 公有方法调用它:
this.#validate(input),私有方法内部仍可安全读写this.#data - 避免暴露实现细节,同时保持类内逻辑清晰
注意:不能跨实例或跨类共享
# 字段是实例级私有,不是类级共享:
- 两个
Counter实例各自拥有独立的#count,互不影响 - 想实现类级别共享数据(如计数器总数),得用 静态字段,但静态字段不支持
#私有语法(目前标准不支持static #field) - 若真需类级私有状态,可用
static privateData = new WeakMap()配合闭包,但这已脱离#机制,属于变通方案
常见误区澄清
有人误以为要“手动共享”私有字段,其实不需要:
- ❌ 不用把
#value作为参数传给另一个方法 - ❌ 不用在方法里 return 它再被其他方法接收
- ✅ 正确做法就是所有方法都直接写
this.#xxx—— 引擎保证它存在且可访问


















