Наследование классов
Добрый вечерочек. Разъясните пожалуйста по теме наследования классов, а именно как работает 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? Получается, как пишут в учебнике, бесконечный цикл. |
Внутри 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);Получаем цикл. |
Часовой пояс GMT +3, время: 11:02. |