Object.getPrototypeOf 是定位原型链问题最直接的工具,用于检查对象原型是否符合预期,可快速发现继承错乱、原型被覆盖或 polyfill 冲突;比 proto 更可靠,适用于验证 new 实例、class 实例、追踪多层原型断裂、识别意外篡改及跨环境原型不一致等问题。

Object.getPrototypeOf 是定位原型链问题最直接的工具,开发阶段用它检查对象的原型是否符合预期,能快速发现继承错乱、原型被意外覆盖或 polyfill 冲突等问题。
确认实例的真实原型
构造函数的 prototype 被修改或实例化方式异常时,实例可能没指向预期原型。用 Object.getPrototypeOf(obj) 比 obj.__proto__ 更可靠(后者非标准且在某些环境不可写)。
- 对 new Foo() 创建的对象,执行 Object.getPrototypeOf(obj) === Foo.prototype 应为 true;不成立说明构造逻辑有误或 Foo.prototype 被重赋值
- 对 class 实例,同样验证是否等于对应类的 prototype;若返回 Object.prototype,大概率是 class 没正确执行(如忘记 new 或被当作普通函数调用)
追踪多层原型链断裂点
当 instanceof 失效或方法调用报 undefined 时,可逐级向上查原型链,定位哪一环断开:
- 先查 Object.getPrototypeOf(obj),再查 Object.getPrototypeOf(Object.getPrototypeOf(obj)),依此类推
- 配合 console.log 或 debugger,把每层结果打印出来,观察是否突然跳到 Object.prototype 或 null,中间某层缺失即为异常源头
- 特别注意 Object.create(null) 创建的对象,其原型为 null,无法继承任何默认方法(如 toString),容易引发静默错误
识别原型被意外篡改
第三方库、全局补丁或不当的 Object.setPrototypeOf 调用可能导致原型被替换。开发中可在关键对象创建后立即检查:
- 在组件初始化、store 实例化、工具对象生成后插入一行:console.assert(Object.getPrototypeOf(obj) === ExpectedCtor.prototype, '原型异常'),失败时中断并提示
- 对已知应继承自 Array 的对象,用 Object.getPrototypeOf(arr) === Array.prototype 判断是否仍为原生数组原型,避免被 lodash.map 等操作意外转为普通对象
对比不同环境下的原型行为
ES6 Module、CommonJS、UMD 包混用时,同一构造函数可能被多次定义,导致 prototype 不共享。调试时可:
- 在浏览器控制台和 Node.js REPL 中分别运行 Object.getPrototypeOf(obj).constructor.name,看是否一致
- 打印 Object.getPrototypeOf(obj).constructor === SomeClass(严格相等),而不仅是 name 字符串匹配,避免同名但不同引用的“假相等”
- 遇到 Vue 或 React 组件实例原型异常,优先检查是否引入了多个版本的框架,导致 Component.prototype 不统一
不复杂但容易忽略——多数原型问题不是语法错误,而是隐式继承关系被破坏。养成创建对象后顺手查一次 Object.getPrototypeOf 的习惯,能省去大量 runtime 迷惑。

















