继承修改子类属性的类将被覆盖

时间:2020-09-06 03:22:36

标签: javascript inheritance

所以这是我能想到的最简单的版本。我知道为什么会发生这种情况,但我不知道解决它的最佳方法。

class TestParent {
    variableA = ""

    constructor(data) {
        for(const key in data) {
            this[key] = data[key]
        }
    }
}

class Test extends TestParent {
    variableB = ""
}

当我尝试此代码时...

let test = new Test({"variableB": "something"})

// Expected {"variableA": "", "variableB": "something"}
// Got      {"variableA": "", "variableB": ""}

现在,如果我从variableB类中删除Test,则代码可以正常工作。从我的代码中得出的结论是,TestParent的构造函数正在执行它的工作,但是一旦调用Test的构造函数,它将使用存储在原型中的默认属性覆盖该属性?

我该如何保存在TestParent构造函数中所做的事情。无需在类范围内定义属性,我只需要在构造函数本身中定义它?我是否缺少添加到该属性的关键字?

1 个答案:

答案 0 :(得分:2)

如果不希望覆盖variableB: 'something',则应在variableB中更改分配给Test的代码部分。仅在该属性尚不存在时,才将空字符串分配给variableB

variableB = this.variableB || ''

class TestParent {
  variableA = ""

  constructor(data) {
    for (const key in data) {
      this[key] = data[key];
    }
  }
}

class Test extends TestParent {
  variableB = this.variableB || ''
}
const test = new Test({
  variableB: "something"
});
console.log(test);

(或者,如果您也想保留虚假值,请variableB = this.variableB === undefined ? '' : this.variableB

相关问题