JS类继承方法报错:私有字段访问引发TypeError的底层原因
JS私有字段继承重写方法报错的底层逻辑
核心原因拆解
私有字段的类绑定规则
JS的私有字段(#xxx)是严格绑定到定义它的类的,子类无法直接访问父类的私有字段,哪怕通过super也不行——私有字段的可见范围仅限于其定义类的内部代码。父类Person的#birthYear和子类Student的#birthYear是完全独立的两个字段,彼此隔离。空
super()导致父类私有字段未就绪
你在子类构造函数中调用了空super(),父类Person的构造函数未接收到初始化私有字段的必要参数,导致父类的#birthYear要么未被赋值(值为undefined),要么处于未就绪状态。重写方法中的非法访问触发报错
当你在子类中重写calculateAge时,若方法内部存在以下两种情况,就会触发报错:- 试图通过
super.#birthYear访问父类私有字段:这违反了私有字段的类绑定规则,直接抛出TypeError提示无法访问父类的#birthYear。 - 调用
super.calculateAge():父类的calculateAge方法会试图访问父类自己的#birthYear,但由于父类构造函数未被正确初始化,该字段的访问会触发错误。
- 试图通过
重命名方法避开错误触发点
当你将子类方法改名为ageCalc时,这是子类全新定义的方法,既不会触发父类的calculateAge方法,也不会出现访问父类私有字段的逻辑,因此可以正常访问子类自己的#birthYear完成计算。未重写的
introduceSelf正常运行的原因introduceSelf作为父类方法,其内部访问的父类私有字段未依赖#birthYear这类需要参数初始化的字段,或者父类构造函数对相关字段有默认处理,因此没有触发非法访问逻辑,得以正常执行。
内容的提问来源于stack exchange,提问作者Attila Fekete
相关产品推荐
相关产品推荐

