我有这两个例子,来自 javascript.info:
例子一:
var animal = {
eat: function() {
alert( "I'm full" )
this.full = true
}
}
var rabbit = {
jump: function() { /* something */ }
}
rabbit.__proto__ = animal
rabbit.eat()
例二:
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
时,它在 speedy
中找不到 found
属性,因此它爬升到原型并在那里更改它。这就是为什么 food.length
对两只仓鼠来说是相等的,换句话说,它们有相同的胃。
由此我了解到,当编写并添加一个不存在的新属性时,解释器将沿着原型链向上,直到找到该属性,然后对其进行更改。
但在例1中,会发生其他情况:
我们运行 rabbit.eat
,它改变 rabbit.full
。没有找到 full
属性,所以它应该沿着原型链向上(对象? ?)我不知道这里发生了什么。在这个示例中,创建并更改了 rabbit
的属性 full
,而在第一个示例中,由于找不到该属性,该属性向原型链上移。
我很困惑,不明白为什么会这样。