Прототип наследования - оформление [дубликат]
На этот вопрос уже есть ответ здесь:
Члены объекта Javascript, которые прототипируются в виде массивов, становятся общими для всех экземпляров класса 3 ответаИтак, у меня есть эти 2 примера из javascript.info:
Пример 1:
var animal = {
eat: function() {
alert( "I'm full" )
this.full = true
}
}
var rabbit = {
jump: function() { /* something */ }
}
rabbit.__proto__ = animal
rabbit.eat()
Пример 2:
function Hamster() { }
Hamster.prototype = {
food: [],
found: function(something) {
this.food.push(something)
}
}
// Create two speedy and lazy hamsters, then feed the first one
speedy = new Hamster()
lazy = new Hamster()
speedy.found("apple")
speedy.found("orange")
alert(speedy.food.length) // 2
alert(lazy.food.length) // 2 (!??)
Начните с примера 2: когда код достигнетspeedy.found
не находитfound
недвижимость вspeedy
и вот он взбирается на прототип и меняет его там. Вот почемуfood.length
одинаково для обоих хомяков, другими словами у них есть тот же самый живот.
Из этого я понимаю, что при написании и добавлении нового свойства, которое не существует, интерпретатор будет идти по цепочке прототипов до тех пор, пока не найдет свойство, а затем не изменит его.
НО в примере 1 происходит что-то еще:
мы бежимrabbit.eat
, который меняетсяrabbit.full
. full
свойство нигде не найдено, поэтому оно должно идти по цепочке прототипов к (объекту ??), и я не уверен, что здесь происходит. В этом примере свойствоfull
изrabbit
создается и изменяется, в то время как в первом примере он идет вверх по цепочке прототипов, потому что не может найти свойство.
Я в замешательстве и не понимаю, почему это происходит.