You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS类构造函数与update复用逻辑时私有属性致子类崩溃问题求助

问题原因

报错的核心是父类构造函数调用了被子类重写的update方法,而此时子类的私有字段还未完成初始化。JavaScript类继承的执行顺序导致:

  1. 实例化子类B时,先调用父类A的构造函数
  2. 父类构造函数里的this.update(props)会调用子类B的update方法(因为this指向子类实例)
  3. 此时子类的私有字段#b还未被初始化(子类私有字段的初始化在父类构造函数执行完成后才进行)
  4. 尝试给未初始化的私有字段#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:07:54