object.getprototypeof是定位原型链异常最直接的工具,它读取内部[[prototype]]值、避免__proto__被篡改误导,可逐层追踪验证继承关系、检测原型是否被错误替换,并与instanceof配合排查问题。

Object.getPrototypeOf 是定位原型链异常最直接的工具,它能快速揭示对象真实继承来源,避免被构造函数名或 __proto__ 显示误导。
确认对象的直接原型是谁
当发现方法调用失败或属性访问不到时,先查它的上一级原型:
- 用
Object.getPrototypeOf(obj)获取 obj 的 [[Prototype]] 指向的对象 - 对比预期(比如希望是
Array.prototype),但实际返回Object.prototype,说明原型链已被意外切断 - 注意:不能用
obj.__proto__替代——它可能被改写,而Object.getPrototypeOf读取的是内部 [[Prototype]] 值,更可靠
逐层向上追踪原型链
配合循环可完整还原链条,尤其适合排查“为什么这个实例没有某个方法”:
- 从目标对象开始,反复调用
Object.getPrototypeOf,直到返回null - 每一步打印构造函数名:
proto.constructor?.name,快速识别断点 - 例如:
const arr = []; Object.getPrototypeOf(arr).constructor.name返回"Array",再执行一次返回"Object",符合预期
检查原型是否被错误替换
常见于手动设置 prototype 或使用 Object.setPrototypeOf 后的调试:
- 新建实例后立即执行
Object.getPrototypeOf(instance) === Constructor.prototype,验证是否仍指向原始原型 - 若为
false,说明原型被重置过——可能是Object.setPrototypeOf(instance, null)或赋值了错误对象 - 特别注意
class实例:即使类中没显式定义方法,Object.getPrototypeOf(instance)也应指向该类的prototype对象
与 instanceof 配合验证继承关系
instanceof 内部依赖原型链查找,但不透明;Object.getPrototypeOf 提供可观察路径:
- 如果
obj instanceof SomeClass返回false,但你认为应该为true,就用Object.getPrototypeOf(obj)看是否漏掉了SomeClass.prototype - 可写一个简单函数遍历链表:
function hasInChain(obj, targetProto) { let p = obj; while (p) { if (p === targetProto) return true; p = Object.getPrototypeOf(p); } return false; }
它不复杂但容易忽略——多数原型问题,只要用 Object.getPrototypeOf 多查两层,就能立刻看到断在哪。











