Отличия в использовании super () при расширении класса - PullRequest
0 голосов
/ 13 января 2019

Я учусь создавать новый класс, расширять его и создавать подклассы. Я не понимаю следующее:

  • Почему при расширении класса в примере # 2 и constructor(), и super() используют length в качестве аргумента?
  • Если super() в примере № 2 предполагается получить доступ к родительскому классу Polygon, не следует ли использовать его в качестве аргументов height и width для доступа к ним в классе Polygon вместо length (как это делает в примере № 4)? Если нет, то почему?

Исходный код: https://googlechrome.github.io/samples/classes-es6/index.html

// Example 1: Creating a new class (declaration-form)
// ===============================================================

class Polygon {
  constructor(height, width) {
    this.name = 'Polygon';
    this.height = height;
    this.width = width;
  }
  sayName() {
    console.log('Hi, I am a ', this.name + '.');
  }

  sayHistory() {
    console.log('"Polygon" is derived from the Greek polus (many) ' +
      'and gonia (angle).');
  }
}


// Example 2: Extending an existing class
// ===============================================================

class Square extends Polygon {
  constructor(length) {
    super(length, length);
    this.name = 'Square';
  }
  get area() {
    return this.height * this.width;
  }
  set area(value) {
    this.area = value;
  }
}

let s = new Square(5);

s.sayName();
console.log('The area of this square is ' + s.area);

// Example 4: Subclassing methods of a parent class
// ===============================================================

class Rectangle extends Polygon {
  constructor(height, width) {
    super(height, width);
    this.name = 'Rectangle';
  }
  sayName() {
    console.log('Sup! My name is ', this.name + '.');
    super.sayHistory();
  }
}

let r = new Rectangle(50, 60);
r.sayName();

1 Ответ

0 голосов
/ 13 января 2019

Имеет смысл, что квадрат принимает только один аргумент - длину одной из его сторон. Но если квадрат является типом многоугольника, то для многоугольников здесь требуется два аргумента, высота и ширина.

Если создается экземпляр Square, ему необходимо вызвать super, чтобы запустить конструктор Polygon, который ожидает два аргумента, height и width. В конструкторе Square они одинаковы - переменная length, следовательно, вызов

super(length, length);

Пример 4 отличается, потому что это Rectangle, а не Square. Прямоугольники принимают два аргумента, высоту и ширину, как и Polygons, поэтому и конструктор Rectangle, и конструктор Polygon вызываются с помощью (height, width), а вызов super отражает, что:

super(height, width);
...