Почему super () должен прийти до доступа к этому - PullRequest
0 голосов
/ 15 марта 2020

В конструкторе класса ES6, почему super() должен стоять перед доступом к this, если нет, то выдается ошибка: Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor.

Но до и после вызова super(), this всегда ссылка на созданный объект. Итак, почему мы должны позвонить super() перед доступом к this, возможно, чтобы предотвратить доступ к неинициализированному родительскому члену? Есть ли еще идеи об этом?

1 Ответ

1 голос
/ 15 марта 2020

С здесь , см. Код ниже. Здесь super() вызывается, чтобы избежать дублирования частей конструктора, которые являются общими для Rectangle и Square.

class Rectangle {
  constructor(height, width) {
    this.name = 'Rectangle';
    this.height = height;
    this.width = width;
  }
  sayName() {
    console.log('Hi, I am a ', this.name + '.');
  }
  get area() {
    return this.height * this.width;
  }
  set area(value) {
    this._area = value;
  }
}

class Square extends Rectangle {
  constructor(length) {
    this.height; // ReferenceError, super needs to be called first!

    // Here, it calls the parent class's constructor with lengths
    // provided for the Rectangle's width and height
    super(length, length);

    // Note: In derived classes, super() must be called before you
    // can use 'this'. Leaving this out will cause a reference error.
    this.name = 'Square';
  }
}

Теперь, почему вызов this перед super() приведет к ReferenceError? Ну, нет однозначного ответа на этот вопрос. Однако интуиция заключается в том, что это требование гарантирует, что конструктор суперкласса имел возможность инициализировать себя перед использованием выделенного объекта. Это означает, что если вы пишете базовый класс, вам не нужно беспокоиться о том, что подклассы случайно забудут вызвать super(), но все равно будут вызывать методы, которые предполагают, что инициализация состоялась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...