JavaScript原型继承疑问:原型对象替换后实例属性差异解析
关于JavaScript原型替换后实例属性访问的疑问解答
嘿,我来帮你把这个原型相关的疑惑掰扯清楚~ 核心点其实在于实例和原型的关联是在创建实例的那一刻就固定下来的,咱们一步步拆解你的代码:
- 第一步:
function Cat() { }定义构造函数后,Cat.prototype默认指向一个包含constructor属性的原型对象。 - 第二步:
Cat.prototype.age = 10;给这个默认原型对象添加了age属性,值为10。 - 第三步:
var cat1 = new Cat();创建cat1时,JavaScript 会把cat1的内部原型(__proto__)指向当前Cat.prototype所引用的那个对象(也就是带age:10的那个),所以此时cat1.age是10。 - 第四步:
Cat.prototype = { age: 15 };这里注意——你不是在修改原来的原型对象,而是直接替换了Cat.prototype的引用!现在它指向一个全新的、只包含age:15的对象,和之前的原型对象完全是两个独立的内存地址。 - 第五步:
var cat2 = new Cat();创建cat2时,它的内部原型会指向这个新的原型对象,所以cat2.age是15。 - 最后:
display(cat1.age)显示10,因为cat1的内部原型自创建以来就没变过,始终指向最初那个带age:10的原型对象,构造函数后续替换prototype的操作不会影响已经存在的实例的原型链。
简单总结:实例的原型链关联是一次性绑定在创建时刻的,构造函数的 prototype 后续的指向变更,只会影响之后新创建的实例,对已经存在的实例毫无影响。
内容的提问来源于stack exchange,提问作者Dimitar Tsonev
相关产品推荐
相关产品推荐

