Доступен ли метод, добавленный к прототипу класса, в унаследованном классе? - PullRequest
1 голос
/ 04 февраля 2020

Я довольно новичок в Javascript и начал несколько дней go. Когда я занимался практикой, я столкнулся с проблемой, хотя я провел обширные исследования, но все равно не получил ее.

Мне дано следующее определение класса Rectangle

class Rectangle {
    constructor(w, h) {
        this.w = w;
        this.h = h;
    }
}

Я являюсь попросил добавить метод area() через прототипирование, и я сделал следующее:

Rectangle.prototype.area = function(){
    return this.w * this.h;
}

И если я унаследую класс Rectangle для класса Square, экземпляр класса квадрата наследует метод area(), который добавляется через прототипирования? Как это?

class Square extends Rectangle{
    constructor(w, h){
        super(w, h);
    }
} 

Учитывая приведенный выше код, возможно ли или как вызвать метод area() из экземпляра Square, чтобы следующий код работал?

const sqr = new Square(3);   
console.log(sqr.area());

Если вы знаком с другими языками, какие прототипы можно сравнить с другими языками, такими как Java, Kotlin и др. c?

1 Ответ

4 голосов
/ 04 февраля 2020

В конструкторе для вашего Square класса есть проблема. Следует принять только один аргумент.

После исправления все работает нормально:

class Rectangle {
  constructor(w, h) {
    this.w = w;
    this.h = h;
  }
}

Rectangle.prototype.area = function() {
  return this.w * this.h;
}

class Square extends Rectangle {
  constructor(w) {
    super(w, w);
  }
}

console.log(new Square(2).area());

Для второй части вашего вопроса:

Если вы знакомы с другими языками, какое прототипирование можно сравнить с другими языками, такими как Java, Kotlin и др. c?

Я думаю этот ответ суммирует различия между классическим наследованием (например, Java) и прототипным наследованием (например, JavaScript) хорошо.

...