原型链断裂导致方法访问失败,需通过object.getprototypeof逐层检查并修复链路,确保targetproto包含方法且无自有属性遮蔽,最终验证instanceof和原型指向双达标。

修改原型后原有实例方法访问不到,不是方法“消失”了,而是查找路径变了——对象还在,但引擎不知道该去哪找那个方法。关键不在补方法,而在恢复或对齐查找链路。
先确认断层真实位置,别猜constructor
别看obj.constructor是否正确,它可能被覆盖或代理拦截。直接查底层链:
- 执行
Object.getPrototypeOf(obj),看返回的是不是你期望的原型对象(比如MyClass.prototype) - 如果返回
null或Object.prototype,说明链已断;若返回一个空对象或陌生原型,说明设错了目标 - 再查一层:
Object.getPrototypeOf(Object.getPrototypeOf(obj)),确认是否漏掉中间继承环节(如Child → Parent → Object)
修复时只换原型,不碰自有属性
Object.setPrototypeOf不会动你实例上已有的属性和方法,它只改“往哪找”。所以:
- 原来
obj.doWork = function(){...},设新原型后obj.doWork仍能调用——这是自有方法,不受影响 - 如果
doWork原本在原型上,现在找不到,说明新原型没提供它;你要确保targetProto确实定义了该方法 - 检查
targetProto.doWork是否存在且可访问,而不是靠obj.doWork报错反推
避免遮蔽:删自有同名属性让查找回落
有时方法“失效”其实是被实例上的同名属性挡住了:
- 比如之前手动写了
obj.doWork = null或obj.doWork = undefined,这会遮蔽原型上的doWork - 执行
delete obj.doWork,清除自有属性,后续访问就会沿新原型链向上查找 - 用
Object.getOwnPropertyDescriptor(obj, 'doWork')确认它是own property还是inherited
验证修复是否生效,两个条件缺一不可
光看obj.doWork()能运行还不够,要同时满足:
-
obj instanceof ExpectedClass为true -
Object.getPrototypeOf(obj) === ExpectedClass.prototype为true - 两者都成立,才说明语义链完整;只满足其一,可能是instanceof缓存未刷新或原型指向错误











