Итак, у меня есть эти 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
равно для обоих хомяков, другими словами, у них один желудок.
Из этого я понимаю, что при написании и добавлении нового свойства, которого не существует, интерпретатор будет продвигаться по цепочке прототипов до тех пор, пока не найдет свойство, а THEN изменит его.
НО в примере 1 произойдет что-то еще:
мы запускаем rabbit.eat
, который меняет rabbit.full
. full
свойство нигде не найдено, поэтому оно должно подниматься вверх по цепочке прототипов до (к объекту?), и хорошо, я не уверен, что здесь происходит. В этом примере свойство full
of rabbit
создано и изменено, в то время как в первом примере оно идет вверх по цепочке прототипов, потому что не может найти свойство.
Я смущен и не понимаю, почему это происходит.