Почему не работает массив в конструкторе? function Hamster() {
this.food = []
}
Hamster.prototype = {
found: function(something) {
this.food.push(something)
}
}
speedy = new Hamster()
lazy = new Hamster()
speedy.found("apple")
speedy.found("orange")
console.log(speedy.food.length) // 2
console.log(lazy.food.length) // 0 (!??)
Читаю javascript.ru там вот этот пример. Мол у каждого хомяка должно быть по 1 в массиве. Но при вызове мы получаем что у одного в массиве 0 а у другого 2. Объясните, как это работает?

21 Авг 2019 в 07:09
224 +1
0
Ответы
1

Проблема здесь заключается в том, что при установке прототипа объекта Hamster на новый объект, созданный через new Hamster(), общий массив food у всех экземпляров объекта Hamster используется как ссылка на один и тот же массив. Поэтому, когда вы добавляете еду для speedy, она также добавляется в массив food для lazy.

Чтобы исправить это, вместо присваивания объекту Hamster нового объекта через Hamster.prototype, можно создать новый объект и присвоить ему свойство прототипа через Object.create:

function Hamster() {
this.food = []
}
Hamster.prototype = {
found: function(something) {
this.food.push(something)
}
}
speedy = new Hamster()
lazy = new Hamster()
speedy.found("apple")
speedy.found("orange")
console.log(speedy.food.length) // 2
console.log(lazy.food.length) // 0

Теперь у каждого экземпляра объекта Hamster будет свой собственный массив food.

20 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир