为了账号安全,请及时绑定邮箱和手机立即绑定

原型继承 - 写

原型继承 - 写

德玛西亚99 2019-05-21 13:54:43
原型继承 - 写所以我有这两个例子,来自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的问题,如果它没有在原型链中的任何位置找到该属性,则会在目标对象上创建该属性。


查看完整回答
反对 回复 2019-05-21
  • 2 回答
  • 0 关注
  • 735 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信