Добрый вечерочек. Разъясните пожалуйста по теме наследования классов, а именно как работает 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? Получается, как пишут в учебнике, бесконечный цикл.