effect_tw
@effect_tw

Почему в конструкторе super вызывается с неочевидным контекстом?

Почему в данном случае в конструкторе Bar , super() , вызовет конструктор Foo , с контекстом Bar ?
602aa507b283b174162293.png
  • Вопрос задан
  • 35 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что вы создаёте объект класса Bar. Функция super() вызывает конструктор родителя, но не меняет контекста.
Ответ написан
alvvi
@alvvi
export default apathy;
Bar [[Prototype => Foo]] так обозначу объект которому вы не дали название, создающийся через new Bar();

1. При первом вызове print в конструкторе Foo:
- this ссылается на объект Bar [[Prototype => Foo]]
- при вызове this.print() соотвественно идет поиск метода print в этом объекте
- до прототипа мы не доходим, поскольку метод есть в объекте Bar и он уже определен даже до окончания вызова construct(!), вызываем метод
- вызов super() еще не закончился, this.id установлен со значением 'foo' в строке выше до вызова метода print(), соотвественно на выходе получаем: 'bar foo'

2. Вызов super() закончился. В свойство this.id нашего объекта записываем значение 'bar' в следующей строке.
- Вызваем print в конструкторе Bar
- JS ищет метод в объетке Bar [[Prototype => Foo]], опять находит его в самом объекте, до прототипа не доходим
- На выходе получаем: 'bar bar'

3. Последний вызов самое легкое. super.print() это то же самое что bar.prototype.print(). Систему поиска методов в объекте обходим, напрямую вызываем метод прототипа
- this.id объекта установили на этапе 2, его последнее значение 'bar'
- напоминаю, вызваем именно метод из прототипа, получаем 'foo bar'

На самом деле все довольно прямолинейно конкретно в этом примере, если понимать протоипное наследование и то, что синтаксис классов лишь синтаксический сахар скрывающий функции-конструкторы с установкой прототипов.

Подробнее почитать тут: https://learn.javascript.ru/prototypes
Про особенности super: https://learn.javascript.ru/class-inheritance
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Artezio Витебск
от 2 800 до 3 300 $