Почему не работает массив в конструкторе? 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
181 +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 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир