为什么不是修改原型的name,而是在实例上添加属性呢?
首先搜索name在原型上搜索到了,然后修改值。
为什么不是跟我想的一样呢?
第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';
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
赋值就是在原实例对象赋值的