JS类构造函数与update复用逻辑时私有属性致子类崩溃问题求助
问题原因
报错的核心是父类构造函数调用了被子类重写的update方法,而此时子类的私有字段还未完成初始化。JavaScript类继承的执行顺序导致:
- 实例化子类
B时,先调用父类A的构造函数 - 父类构造函数里的
this.update(props)会调用子类B的update方法(因为this指向子类实例) - 此时子类的私有字段
#b还未被初始化(子类私有字段的初始化在父类构造函数执行完成后才进行) - 尝试给未初始化的私有字段
#b赋值,触发类型错误
可行解决方案(保留私有属性)
方案一:父类构造函数自行初始化,不在构造函数中调用update
修改父类A,将初始化逻辑直接写在构造函数里,update仅作为后续更新的方法:
class A { #a = '' constructor(props = {}) { // 直接初始化私有属性,不调用update this.#a = props.a ?? '' } update(props) { this.#a = props.a ?? '' } } class B extends A { #b = '' constructor(props = {}) { super(props) // 子类构造函数中调用update初始化自身私有属性 this.update(props) } update(props) { super.update(props) this.#b = props.b ?? '' } } const b = new B({a: 'a', b: 'b'}) // 正常执行
方案二:父类拆分初始化与更新逻辑
父类提供私有初始化方法,update调用该方法;子类重写update时,确保自身私有字段已初始化:
class A { #a = '' constructor(props = {}) { this.#init(props) } // 私有初始化方法,不会被子类重写 #init(props) { this.#a = props.a ?? '' } update(props) { this.#init(props) } } class B extends A { #b = '' constructor(props = {}) { super(props) // 初始化自身私有字段 this.#b = props.b ?? '' } update(props) { super.update(props) this.#b = props.b ?? '' } } const b = new B({a: 'a', b: 'b'}) // 正常执行
内容的提问来源于stack exchange,提问作者colinta
相关产品推荐
相关产品推荐

