最直接可靠的方法是使用 Object.prototype.isPrototypeOf() 方法,它判断调用对象是否在参数对象的原型链上;需注意左侧必须为对象,右侧为待检测对象,且不适用于原始值或 null。

在 JavaScript 中,检测一个对象是否以某个对象为原型(即该对象是否在目标对象的原型链上),最直接可靠的方法是使用 Object.prototype.isPrototypeOf() 方法。
使用 isPrototypeOf() 检测原型关系
该方法由所有对象继承自 Object.prototype,用于判断调用者是否出现在参数对象的原型链中。
- 语法:
prototypeObj.isPrototypeOf(obj) - 返回值:
true表示prototypeObj是obj的原型(或其原型链上的某一级);否则为false - 注意:要求左侧必须是对象(不能是
null或原始值),右侧是待检测的对象
例如:
const parent = { a: 1 };
const child = Object.create(parent);
console.log(parent.isPrototypeOf(child)); // true
console.log({}.isPrototypeOf(child)); // false(Object.prototype 不是 child 的直接/间接原型,因为 child 的原型是 parent)
配合 getPrototypeOf 逐级检查(较少用,但更可控)
如果需要确认是否为直接原型(而非整个原型链),可结合 Object.getPrototypeOf() 比较:
立即学习“Java免费学习笔记(深入)”;
-
Object.getPrototypeOf(obj) === targetProto→ 判断是否为直接原型 - 若需检查整条链,可用循环向上遍历,直到返回
null
示例(检查是否为直接原型):
const parent = {};
const child = Object.create(parent);
console.log(Object.getPrototypeOf(child) === parent); // true
避免误用 instanceof
instanceof 检测的是对象是否为某个构造函数的实例(即该构造函数的 prototype 是否在其原型链上),它依赖于函数的 prototype 属性,不适用于任意普通对象作为“原型”来检测。
- ✅ 正确场景:判断
arr instanceof Array - ❌ 不适用场景:想检测
obj是否以某个字面量对象{x: 1}为原型 —— 因为后者不是函数,无法用instanceof
注意 __proto__ 不是标准检测方式
虽然可通过递归访问 obj.__proto__ 手动遍历原型链,但:
-
__proto__是非标准(尽管被广泛支持)的访问器,不应在生产代码中用于检测逻辑 - 推荐始终优先使用
isPrototypeOf()或getPrototypeOf() -
__proto__已被Object.getPrototypeOf()和Object.setPrototypeOf()取代


















