Answer
t.me/js_testОтвет:
Исправленный вариант кода:
const hamster = {
stomach: [],
eat(food) {
// присвоение значения this.stomach вместо вызова this.stomach.push
this.stomach = [food];
}
};
const speedy = {
__proto__: hamster
};
const lazy = {
__proto__: hamster
};
speedy.eat("apple");
console.log( speedy.stomach ); // ["apple"]
console.log( lazy.stomach ); // [ ]
Обьяснение:
Давайте внимательно посмотрим, что происходит при вызове speedy.eat("apple").
- Сначала в прототипе (
=hamster) находится методspeedy.eat, а затем он выполняется сthis=speedy(объект перед точкой). - Затем в
this.stomach.push()нужно найти свойствоstomachи вызвать для негоpush. Движок ищетstomachвthis(=speedy), но ничего не находит. - Он идёт по цепочке прототипов и находит
stomachвhamster. - И вызывает для него
push, добавляя еду в живот прототипа.
Получается, что у хомяков один живот на двоих!
И при lazy.stomach.push(...) и при speedy.stomach.push(), свойство stomach берётся из прототипа (так как его нет в самом объекте), затем в него добавляются данные.
Обратите внимание, что этого не происходит при простом присваивании this.stomach= (как в исправленном варианте).
Код для проверки:
const hamster = {
stomach: [],
eat(food) {
// присвоение значения this.stomach вместо вызова this.stomach.push
this.stomach = [food];
}
};
const speedy = {
__proto__: hamster
};
const lazy = {
__proto__: hamster
};
speedy.eat("apple");
console.log( speedy.stomach ); // ["apple"]
console.log( lazy.stomach ); // [ ]