直接修改prototype上的属性或方法会立即影响所有未遮蔽该属性的已有实例,因为实例通过__proto__共享同一原型对象引用,属性查找是实时动态过程;遮蔽后实例不再访问原型;替换整个prototype则旧实例完全不受影响。

直接修改 prototype 对象上的属性或方法,会立刻反映到所有未遮蔽该属性的已有实例上——因为实例通过内部 [[Prototype]](即 __proto__)共享同一个原型对象引用,查找是实时的,不是拷贝。
改原型对象内容:旧实例立即感知变化
只要不替换整个 prototype,而是对现有原型对象做增、删、改操作,所有已创建且未自行定义同名属性的实例都会立刻响应:
-
添加属性:如
Person.prototype.city = '广州',所有没设过city的实例马上能读到'广州' -
修改值:如把
Person.prototype.age = 25改为30,未赋过age的实例再次读取就是30 -
删除属性:用
delete Person.prototype.age后,实例再读age会继续沿链向上找(比如到Object.prototype),或返回undefined
遮蔽会让实例“断连”原型
一旦实例自身设置了同名属性,比如 person1.age = 35,后续对该属性的所有读写都只发生在实例自身:
- 引擎查找时在实例上就停下了,根本不会走到原型上去
- 之后再改
Person.prototype.age,person1.age的值和行为完全不受影响 - 这不是延迟生效,而是属性查找机制的自然终止
替换整个 prototype:旧实例完全不受影响
如果用赋值方式彻底重写:Person.prototype = { say() { } },这属于“断连”操作:
- 已有实例的
__proto__仍指向原来的原型对象,不会自动切换 - 旧实例无法访问新
say方法,也看不到新原型上的任何改动 - 只有之后
new Person()创建的新实例才使用新原型 -
instanceof判断也可能出问题:旧实例的__proto__链里不再包含新Person.prototype,所以oldInst instanceof Person可能返回false
关键前提:共享引用 + 查找机制
这种表现的根本原因在于:
- 所有实例的
__proto__指向的是同一个原型对象(内存地址相同) - 属性访问是动态查找过程:先查自身 → 再查
__proto__→ 再往上…… - 改的是那个“共同指向的对象”,所以只要没被遮蔽,下一次查找自然拿到新值

















