Итак, у меня есть эти 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 создано и изменено, в то время как в первом примере оно идет вверх по цепочке прототипов, потому что не может найти свойство.
Я смущен и не понимаю, почему это происходит.
