原型继承 - 写

原型继承 - 写

所以我有这两个例子,来自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创建并更改了属性,而在第一个示例中,它上升了原型链,因为它找不到属性。


我很困惑,也看不出为什么会这样。


德玛西亚99
浏览 736回答 2
2回答

慕侠2389804

原型不是实例化对象的每个实例。Hamster.prototype.food = []Hamster的每个实例都将共享该数组如果您需要(在这种情况下),每个Hamster的食物集合的单独实例,您需要在实例上创建属性。例如:function Hamster() {   this.food = [];}要回答关于示例1的问题,如果它没有在原型链中的任何位置找到该属性,则会在目标对象上创建该属性。
打开App,查看更多内容
随时随地看视频慕课网APP