javascript私有字段(#开头)是语法级强制封装机制,解析时即禁止外部访问,不支持任何动态读取方式,子类不可继承,旨在通过公共接口管控状态变更。

因为私有字段(如 JavaScript 中以 # 开头的字段)的访问权限由语言本身在语法层面强制约束,不是靠约定或运行时检查,而是在解析阶段就禁止外部引用。
私有字段的语法隔离是硬性规则
-
#前缀不是命名习惯,而是标识符的一部分,它让该名称在词法上就与普通属性完全分离。 - 外部代码写
instance.#privateField会直接报SyntaxError,连编译(或解析)都通不过,更别说运行时访问。 - 不支持方括号访问(如
instance['#privateField'])、Object.keys()、for...in、JSON.stringify()等任何动态方式读取。
和传统“伪私有”方案有本质区别
- 下划线前缀(如
_field)只是开发者约定,外部仍可自由读写,毫无保护力。 - WeakMap 或闭包模拟私有,逻辑复杂、性能开销大,且无法在类体内部统一声明和管理。
-
#字段则由引擎原生支持,声明简洁、访问明确、性能接近公有字段。
设计意图是封装,不是隐藏全部
- 私有字段不等于“彻底锁死”,而是要求所有对外交互必须走明确定义的公共接口(比如
getXXX()、setXXX()或其他业务方法)。 - 这样能确保状态变更受控,避免外部绕过逻辑直接篡改内部数据,比如银行账户余额不能被
account.#balance = -1000随意设为负数。
子类也不能继承或访问
- 即使子类继承了该 class,也无法通过
this.#xxx访问父类的私有字段。 - 这不同于
protected,它不提供“家族内可见”,而是严格限定在声明它的那个类的词法作用域内。
基本上就这些。











