class Start{ constructor(name,age,year){ this.name=name; this.age=age; this.year=year; } fn(value){ console.log(value) } } class Son extends Start{ constructor(val,val2){ this.sum = val+val2 } } // const son =new Son(10,10) // console.log(son) // son.fn(son.sum) //Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor class Son_true extends Start { constructor(val,val2){ super(1,2,3); //利用super调用父类的构造函数super必须在子类this之前调用 this.sum = val+val2 } } const SonTrue =new Son_true(10,10) SonTrue.fn(SonTrue.sum) SonTrue.fn(SonTrue) //super(1,2,3) {name: 1, age: 2, year: 3, sum: 20}
时间: 2024-02-14 17:26:33 浏览: 148
你的代码中定义了一个父类 Start 和一个继承自 Start 的子类 Son。在子类 Son 的构造函数中,你试图使用 this 关键字来访问和初始化子类的属性 sum。
然而,在 JavaScript 中,如果一个子类有构造函数,它必须在使用 this 关键字之前调用父类的构造函数,即使用 super()。这是因为子类继承了父类的属性和方法,需要先初始化父类的部分,才能确保正确访问和使用继承的属性。
在你的代码中,你尝试在子类 Son 的构造函数中访问 this.sum,但没有先调用 super()。因此,你遇到了错误提示:"Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor"。
为了解决这个问题,你需要在子类 Son 的构造函数中调用 super(),以便先初始化父类的属性。修改后的代码如下:
```javascript
class Son extends Start {
constructor(val, val2) {
super(); // 调用父类的构造函数
this.sum = val + val2;
}
}
```
另外,在你的代码中,你定义了另一个子类 Son_true,它正确地调用了父类的构造函数 super(1, 2, 3),并成功地访问和使用了继承的属性。所以当你创建 Son_true 的实例并调用 fn 方法时,会得到预期的结果。
希望这能帮助到你!如果你有任何其他问题,请随时问我。
阅读全文