我对javascript中的super()有疑问。
我应该在子类中使用super()调用父类方法'stringy()'还是这样使用:
function solve() {
class Melon {
constructor(weight, melonSort) {
if (new.target === Melon) {
throw new Error('Abstract class cannot be instantiated directly.')
}
this.weight = weight;
this.melonSort = melonSort;
this._elementIndex = weight * Number(melonSort.length);
}
stringy() {
return `Element: ${this.element}\nSort: ${this.melonSort}\nElement Index: ${this._elementIndex}`
}
}
class Watermelon extends Melon {
constructor(weight, melonSort) {
super(weight, melonSort);
this.element = 'Water';
}
}
要么
function solve() {
class Melon {
constructor(weight, melonSort) {
if (new.target === Melon) {
throw new Error('Abstract class cannot be instantiated directly.')
}
this.weight = weight;
this.melonSort = melonSort;
this._elementIndex = weight * Number(melonSort.length);
}
stringy() {
return `Element: ${this.element}\nSort: ${this.melonSort}\nElement Index: ${this._elementIndex}`
}
}
class Watermelon extends Melon {
constructor(weight, melonSort) {
super(weight, melonSort);
this.element = 'Water';
}
stringy(){
return super.stringy();
}
}
哪一个是正确的,有什么区别。
最佳答案
除非您要更改行为,否则无需在stringy
中包含Watermelon
。如果没有,Watermelon
实例将继承Melon
版本。您的Watermelon
的两个版本几乎完全相同,并且在任一版本的实例上对stringy
的调用都将创建并返回相同的字符串。如果stringy
使用了参数,则覆盖的参数必须确保传递它收到的所有参数,但stringy
不使用任何参数,所以...
(仅出于完整性考虑:唯一的细微差别是,在Watermelon
的第二个版本中有一个Watermelon.prototype.stringy
函数,而在第一个版本中没有Watermelon.prototype
函数。没有问题就很好了,因为Melon.prototype
继承自具有stringy
的。)
关于javascript - 我应该在子类中使用super()调用父类方法吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58736833/