Должен ли я вызвать метод родительского класса с super () в дочернем классе - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть вопрос о super () в javascript. Должен ли я вызвать метод родительского класса 'stringy ()' с помощью super () в дочернем классе, или я могу использовать его следующим образом:

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();
    }
}

, который являетсяправильно и в чем разница.

1 Ответ

1 голос
/ 06 ноября 2019

Нет необходимости включать stringy в Watermelon, если вы не хотите изменить поведение. Watermelon экземпляры унаследуют версию Melon, если вы этого не сделаете. Ваши две версии Watermelon очень похожи идентичны, и вызовы stringy в экземплярах любой версии создадут и вернут одну и ту же строку. Если stringy использует аргументы, ваш перезаписанный должен обязательно передавать все полученные аргументы, но stringy не использует никаких, поэтому ...


(Просто для полноты: единственное небольшое отличие состоит в том, что во второй версии Watermelon есть функция Watermelon.prototype.stringy, тогда как в вашей первой версии ее нет. Хорошо, что нетпотому что Watermelon.prototype наследуется от Melon.prototype, который имеет stringy.)

...