js一个原型的问题

图片.png

为什么不是修改原型的name,而是在实例上添加属性呢?
首先搜索name在原型上搜索到了,然后修改值。
为什么不是跟我想的一样呢?

阅读 2k
4 个回答

赋值就是在原实例对象赋值的

第15行a.name取值时,因为实例a上并没有属性name,此时name的值是fun.prototype上的属性name的值。原型链的查找为:a.name(a上并没有name属性,通过原型链向下查找) => a.__proto__.name => fun.prototype.name => A

第16行a.name = 'C'。这时实例a上就有个属性name。此时原型链查找为:a.name(a上有name属性) => C

这里有一点你要注意在第10行重写fun.prototype原型时,一定要放在实例化对象之前。并且要给fun.prototype添加constructor属性。

fun.prototype = {
    constructor:fun,
    name:'A'
}

a.name = 'C';执行之后,相当于给 a 添加了新属性。

a = {
  name: 'C';
  __proto__: {
    constructor: fun,
    name: 'A'
  }
}

再次打印的时候,取值优先从 a 自己身上取,没有的话在找原型链上。

新手上路,请多包涵

a是一个对象,所以a.name = 'C'的意思是,把'C'这个字符串值赋值给a对象的name属性,等价写法有:

a['name'] = 'C';

如果要对原型属性赋值:

Object.getPrototypeOf(a).name = 'C';
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题