Почему не работает массив в конструкторе? 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. Объясните, как это работает?
Проблема здесь заключается в том, что при установке прототипа объекта Hamster на новый объект, созданный через new Hamster(), общий массив food у всех экземпляров объекта Hamster используется как ссылка на один и тот же массив. Поэтому, когда вы добавляете еду для speedy, она также добавляется в массив food для lazy.
Чтобы исправить это, вместо присваивания объекту Hamster нового объекта через Hamster.prototype, можно создать новый объект и присвоить ему свойство прототипа через Object.create:
Проблема здесь заключается в том, что при установке прототипа объекта 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.