我对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/

10-09 17:04