Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2019, 20:01
Интересующийся
Отправить личное сообщение для Devero97 Посмотреть профиль Найти все сообщения от Devero97
 
Регистрация: 03.08.2019
Сообщений: 17

Наследование классов
Добрый вечерочек. Разъясните пожалуйста по теме наследования классов, а именно как работает super.

Читаю обновленный учебник и застопорился на моменте, где рассказывают про то, как работает super при наследовании класса.

Первый пример я понял, но вот дальше не могу разораться:
let animal = {
  name: "Животное",
  eat() {
    alert(`${this.name} ест.`);
  }
};

let rabbit = {
  __proto__: animal,
  eat() {
    // ...делаем что-то специфичное для кролика и вызываем родительский (animal) метод
    this.__proto__.eat.call(this); // (*)
  }
};

let longEar = {
  __proto__: rabbit,
  eat() {
    // ...делаем что-то, связанное с длинными ушами и вызываем родительский (rabbit) метод
    this.__proto__.eat.call(this); // (**)
  }
};

longEar.eat(); // Error: Maximum call stack size exceeded


В учебнике пишут, что: В обеих строках (*) и (**) значение this – это текущий объект (longEar). И в обеих линиях (*) и (**) значение this.__proto__ одно и то же: rabbit

Каким образом в объекте Rabbit в методе eat() this является longear, а не rabbit?
Почему тут объект Rabbit не ссылается на объект Animal, а объект LongEar на объект Rabbit? Получается, как пишут в учебнике, бесконечный цикл.
Ответить с цитированием
  #2 (permalink)  
Старый 14.08.2019, 23:25
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,466

Внутри longEar.eat:
this.__proto__.eat.call(this);
то же самое, что
rabbit.eat.call(longEar)
и когда вы тут используете call - вы принудительно устанавливаете this для rabbit.eat равным longEar.


Соответственно внутри rabbit.eat:
this.__proto__.eat.call(this);
становится равноценным
longEar.__proto__.eat.call(longEar);
и следовательно
rabbit.eat.call(longEar);
Получаем цикл.
__________________
29375, 35

Последний раз редактировалось Aetae, 14.08.2019 в 23:28.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование классов shokoMoko Общие вопросы Javascript 2 23.05.2016 10:49
Наследование классов классами shokoMoko Общие вопросы Javascript 2 23.05.2016 09:23
Наследование классов Panamaster Javascript под браузер 10 16.11.2014 03:03
Эмулятор классов на JavaScript yriiarutiunian Ваши сайты и скрипты 4 24.10.2014 21:26
Наследование функционала классов атомарных типов FINoM Общие вопросы Javascript 8 14.01.2012 17:39