Object.getPrototypeOf()是获取对象真实原型的唯一标准方式,直接读取内部[[Prototype]],结果确定、安全、跨环境一致;它可精准判断继承关系、安全遍历原型链、严防参数错误,并区分实例原型与构造器prototype属性。

Object.getPrototypeOf() 是获取对象真实原型的唯一标准方式,它不依赖可被篡改的 constructor 或已废弃的 proto,直接读取内部 [[Prototype]],结果确定、安全、跨环境一致。
精准判断继承关系,避开 instanceof 的陷阱
instanceof 在跨 iframe 或不同执行上下文时会失效(因构造函数不共享),而 Object.getPrototypeOf 可靠比对原型引用:
- 检查是否为原生数组:
Object.getPrototypeOf(arr) === Array.prototype - 验证子类实例是否正确链接父类:
Object.getPrototypeOf(Object.getPrototypeOf(child)) === Parent.prototype - 避免用
obj.constructor === Array—— constructor 属性易被覆盖,不可信
安全遍历原型链,防止无限循环
原型链终点是 null,不是 undefined,循环终止条件必须严格判断:
- 正确写法:
let p = obj; while (p !== null) { /* 处理 p */ p = Object.getPrototypeOf(p); } - 错误写法:
while (p)—— 当某层原型是{}(空对象)时,p为真值但非null,可能跳过终点或误判 - 对
Object.create(null)创建的对象,首次调用即返回null,链长为 0
严防参数错误:只接受对象,拒绝原始值和 null
该方法对非对象输入抛 TypeError,不是静默失败,需提前校验:
- 不能传入
null、undefined、数字字面量42、字符串"abc" - 若需处理原始值,先显式包装:
Object.getPrototypeOf(Object(42)) === Number.prototype,但不推荐依赖此行为 - 稳妥预检:
obj != null && typeof obj === 'object',再调用
区分实例原型与构造器 prototype 属性
这是最常混淆的点:两者语义完全不同:
-
Object.getPrototypeOf(new Foo())→ 返回Foo.prototype(实例的真实原型) -
Object.getPrototypeOf(Foo)→ 返回Function.prototype(函数对象自身的原型) -
Object.getPrototypeOf(Foo.prototype)→ 返回Object.prototype(因为 prototype 本身是普通对象) -
Foo.prototype是供new Foo()实例继承用的,不是Foo自身的原型
调试原型链断裂的三步定位法
当方法调用报错或属性找不到时,快速定位问题层级:
- 第一步:查实例直接原型 ——
Object.getPrototypeOf(obj)是否为你预期的构造器 prototype - 第二步:查该原型的原型 ——
Object.getPrototypeOf(Object.getPrototypeOf(obj))是否连到上一级 - 第三步:打印整条链 —— 写个简短函数逐级输出,一眼看出哪一环意外变成
null或跳转到Object.prototype


















