子类不能直接访问父类的私有属性。es6中用#声明的私有属性和方法仅限定义它的class内部使用,子类无法通过this.#xxx或super.#xxx访问;应通过父类提供的getter/setter或静态方法间接访问,或改用下划线约定命名。

子类不能直接访问父类的私有属性。
私有属性不可被继承或直接访问
ES6 中用 # 声明的私有属性(如 #id、#secret)仅限于定义它的 class 内部使用。子类即使继承了父类,也无法通过 this.#xxx 访问父类的私有成员——运行时会立即抛出语法错误。
- 父类私有属性不会出现在子类实例上
-
super.#xxx同样非法,不支持跨类访问 - 私有方法同理,子类调用
super.#method()也会报错
正确方式:通过公开的 getter/setter 间接访问
如果父类提供了公开的访问接口(比如 getter 方法),子类就能安全读取私有状态:
- 父类定义
get secret() { return this.#secret; } - 子类中调用
this.secret或super.secret即可获取值 - 同理,可用 setter 封装写入逻辑,避免暴露私有字段本身
静态私有属性也不可被子类访问
父类的静态私有属性(如 static #token = 'abc';)同样受限于类作用域。子类无法通过 SuperClass.#token 或 super.#token 访问,必须依赖父类暴露的静态方法(如 SuperClass.getToken())来间接获取。
替代方案:用常规属性 + 约定命名
若需子类自由访问,可改用下划线前缀(如 _internalId)作为“约定私有”——它不是语言级保护,但能明确表达意图,且子类可正常读写。这种方式适用于不需要强封装的场景。











