【问题标题】:Inheriting a class that modifies properties of child class get overwritten继承修改子类属性的类被覆盖
【发布时间】:2020-09-06 03:22:36
【问题描述】:

所以这是我能想到的最简单的问题版本。我理解它为什么会发生,但我不知道修复它的最佳方法。

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": ""}

现在,如果我从 Test 类中删除 variableB,那么代码就可以正常工作。从我的代码中收集到的是TestParent 的构造函数正在完成它的工作,但是一旦调用Test 的构造函数,它就会用存储在原型中的默认属性覆盖属性?

如何保存在TestParent 构造函数中完成的操作。我只需要在构造函数本身中定义它,而不是在类范围中定义属性?我是否缺少要添加到该属性的关键字?

【问题讨论】:

    标签: javascript inheritance


    【解决方案1】:

    如果您不希望variableB: 'something' 被覆盖,您应该在Test 中更改分配给variableB 的代码部分。仅当属性尚不存在时,才将空字符串分配给 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

    【讨论】:

    • 好的,我想我了解 javascript 对构造函数的作用。它在运行所有超级后将值从原型复制到实例。谢谢你的帮助,我很感激。