原型继承 - 写所以我有这两个例子,来自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 onespeedy = new Hamster()lazy = new Hamster()speedy.found("apple")speedy.found("orange")alert(speedy.food.length) // 2alert(lazy.food.length) // 2 (!??)从示例2开始:当代码到达时speedy.found,它找不到found属性speedy,因此它爬上原型并在那里进行更改。这就是为什么food.length两只仓鼠都是平等的,换句话说,它们有相同的胃。据我所知,在编写和添加一个不存在的新属性时,解释器将上升到原型链,直到找到属性,然后更改它。但是在示例1中还发生了其他事情:我们运行rabbit.eat,这会发生变化rabbit.full。full属性无处可寻,所以它应该上升到原型链(对象??),好吧,我不知道这里发生了什么。在此示例中full,rabbit创建并更改了属性,而在第一个示例中,它上升了原型链,因为它找不到属性。我很困惑,也看不出为什么会这样。
2 回答
慕侠2389804
TA贡献1719条经验 获得超6个赞
原型不是实例化对象的每个实例。
Hamster.prototype.food = []
Hamster的每个实例都将共享该数组
如果您需要(在这种情况下),每个Hamster的食物集合的单独实例,您需要在实例上创建属性。例如:
function Hamster() { this.food = [];}
要回答关于示例1的问题,如果它没有在原型链中的任何位置找到该属性,则会在目标对象上创建该属性。
添加回答
举报
0/150
提交
取消