Answer

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").

  1. Сначала в прототипе (=hamster) находится метод speedy.eat, а затем он выполняется с this=speedy (объект перед точкой).
  2. Затем в this.stomach.push() нужно найти свойство stomach и вызвать для него push. Движок ищет stomach в this (=speedy), но ничего не находит.
  3. Он идёт по цепочке прототипов и находит stomach в hamster.
  4. И вызывает для него 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 ); // [ ]

Report Page