原型链修改直接影响已创建实例的前提是实例未遮蔽同名属性;遮蔽后实例属性查找终止于自身;替换整个prototype不影响旧实例的__proto__指向,故旧实例无法访问新方法且instanceof可能返回false。

原型链修改会直接影响已创建的实例,但前提是实例没自己定义同名属性——这是 JavaScript 属性查找机制决定的,不是响应式系统在起作用。
修改原型属性,实例读取会立刻变
只要实例没遮蔽(即没自己设置同名属性),对 原有 prototype 对象 的增、改、删操作,下一次读取就会生效:
- 添加属性:比如
Person.prototype.city = '深圳',所有未设city的实例马上能读到'深圳' - 修改属性:比如把
Person.prototype.age = 25改成30,没自己赋过age的实例读取结果立即变成30 - 删除属性:用
delete Person.prototype.age后,实例再读age就会继续往上找(比如到Object.prototype),或返回undefined
遮蔽会让实例“断连”原型
一旦实例自己设置了同名属性,比如 person1.age = 35,后续所有对该属性的读写都只在实例自身发生:
-
person1.hasOwnProperty('age')返回true - 再改
Person.prototype.age,person1.age值不变,也不受影响 - 这种行为不是延迟或失效,而是查找提前终止——引擎根本不会走到原型上去
替换整个 prototype 不影响旧实例
如果用赋值方式彻底换掉原型:Person.prototype = { say() { } },那已有实例仍指向原来的 prototype 对象:
- 旧实例无法访问新方法
say - 旧实例仍能读写原来 prototype 上的属性(哪怕你后来又改了它)
- 只有新
new Person()创建的实例才用新 prototype
instanceof 判断也会跟着变
instanceof 检查的是实例的 __proto__ 链是否包含构造函数的 prototype:
- 如果你替换了
Person.prototype,旧实例的__proto__还是指向旧对象,所以oldInst instanceof Person可能变成false - 反过来,如果只是往原 prototype 上加方法,不影响
instanceof结果


















