最准确的方式是用 isPrototypeOf() 方法检测原型链关系,即 obj.isPrototypeOf(target) 判断 obj 是否在 target 的原型链上;其次可用 Object.getPrototypeOf() 手动遍历;避免误用 instanceof 和 __proto__。

可以用 isPrototypeOf() 方法直接检测——这是最准确、语义最清晰的方式。
使用 obj.isPrototypeOf(target)
该方法判断调用者(obj)是否存在于 target 的原型链上。注意:是 obj.isPrototypeOf(target),不是 target.isPrototypeOf(obj)。
-
Array.prototype.isPrototypeOf([])→true -
Object.prototype.isPrototypeOf({})→true -
{}.__proto__.isPrototypeOf({})→true(但不推荐直接访问__proto__) -
Function.prototype.isPrototypeOf(function(){})→true
用 Object.getPrototypeOf() 手动遍历
适合需要自定义逻辑或理解原理的场景。从目标对象开始,逐级向上取原型,直到为 null 或匹配到指定对象。
- 写法示例:
function isInPrototypeChain(prototype, obj) {<br> while (obj !== null) {<br> if (obj === prototype) return true;<br> obj = Object.getPrototypeOf(obj);<br> }<br> return false;<br>} - 注意:必须用
===比较引用,不能用==或Object.is()替代(因为要精确匹配同一对象)
避免误用 instanceof
instanceof 检查的是构造函数的 prototype 是否在对象原型链上,不是任意对象。
立即学习“Java免费学习笔记(深入)”;
-
[] instanceof Array→true(检查Array.prototype) -
Array.prototype instanceof Array→false(Array.prototype本身不是Array实例) - 若想检查
A是否在B的原型链上,A不是构造函数时,instanceof无法直接使用
注意 __proto__ 和 prototype 的区别
__proto__ 是实例的内部原型引用(已不推荐直接使用),prototype 是函数对象上用于创建实例原型的属性。只有函数才有 prototype;所有普通对象都有 __proto__(等价于 Object.getPrototypeOf(obj))。
- 正确写法:
Array.prototype.isPrototypeOf([]) - 错误写法:
[].__proto__.isPrototypeOf(Array.prototype)(方向反了,且依赖非标准属性) - 兼容性建议:始终优先用
Object.getPrototypeOf()和isPrototypeOf()


















