object.getprototypeof是获取对象直接原型的标准方法,不可用于类型判断、跨帧实例检测、替代instanceof或遍历整个原型链,且仅接受对象参数,否则抛出typeerror。

Object.getPrototypeOf 是获取对象原型(即 [[Prototype]])的标准方法,但它常被误用于判断类型、检测实例关系或替代 instanceof,结果导致逻辑错误或兼容性问题。
误当作类型判断工具
开发者有时用它来“看对象是不是某个类的实例”,比如:
if (Object.getPrototypeOf(obj) === Array.prototype) { /* ... */ }
这在多数情况下看似可行,但忽略了一个关键点:对象可能通过 Object.setPrototypeOf 或 __proto__ 被篡改原型,也可能来自不同全局环境(如 iframe),此时 Array.prototype 不再相等。更稳妥的方式是用 Array.isArray(obj) 或 obj instanceof Array(注意跨帧限制)。
混淆原型链顶端与直接原型
Object.getPrototypeOf(obj) 只返回 直接 原型,不是整个原型链。有人误以为它能“找到最顶层的原型”或“跳过中间层”,其实不能。例如:
- 对普通对象,它返回
Object.prototype; - 对数组,返回
Array.prototype(而非Object.prototype); - 若想遍历整条链,需反复调用该方法直到返回
null。
在非对象值上直接调用
该方法只接受对象类型参数,传入 null、undefined、原始值(如字符串、数字)会抛出 TypeError。常见错误写法:
Object.getPrototypeOf('hello') // TypeError!
正确做法是先确保参数为对象:typeof x === 'object' && x !== null,或用 Object(x) 包装(但要注意语义变化)。
替代 instanceof 时忽略构造器不确定性
有人试图用原型比对模拟 instanceof 行为:
function isInstanceOf(obj, Constructor) {
let proto = Object.getPrototypeOf(obj);
return proto === Constructor.prototype ||
proto === Object.getPrototypeOf(Constructor.prototype);
}
这种实现极不可靠——无法处理多层继承、动态修改原型、Symbol.hasInstance 自定义行为,也绕过了引擎优化。应直接使用 obj instanceof Constructor,必要时配合 Symbol.hasInstance 协议。











