使用 isPrototypeOf() 方法最准确,如 Parent.prototype.isPrototypeOf(childInstance) 返回 true;也可手动遍历原型链,通过 Object.getPrototypeOf() 循环判断,但推荐前者,语义清晰且可靠。

要判断一个对象是否是另一个对象的原型链祖先,最准确的方法是使用 Object.getPrototypeOf() 配合循环遍历原型链,或者使用 isPrototypeOf() 方法。
使用 isPrototypeOf() 方法(推荐)
这是最直接、语义清晰的方式。该方法用于判断某个对象是否在另一个对象的原型链中。语法: prototypeObj.isPrototypeOf(object)
如果 prototypeObj 出现在 object 的原型链中,返回 true,否则返回 false。
function Parent() {}
function Child() {}
Child.prototype = Object.create(Parent.prototype);
const childInstance = new Child();
console.log(Parent.prototype.isPrototypeOf(childInstance)); // true
console.log(Object.prototype.isPrototypeOf(childInstance)); // true
console.log(Array.prototype.isPrototypeOf(childInstance)); // false
手动遍历原型链(深入理解原理)
通过反复调用Object.getPrototypeOf() 可以手动检查整个原型链。
这种方法适合学习原型链机制,或需要自定义判断逻辑时使用。
立即学习“Java免费学习笔记(深入)”;
示例:实现一个通用函数function isPrototypeAncestor(ancestor, obj) {
let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (proto === ancestor) {
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}
// 使用示例
function A() {}
function B() {}
B.prototype = Object.create(A.prototype);
const b = new B();
console.log(isPrototypeAncestor(A.prototype, b)); // true
console.log(isPrototypeAncestor(Object.prototype, b)); // true
注意事项
避免使用__proto__ 或 constructor 进行判断,原因如下:
-
__proto__已被弃用,尽管大多数环境仍支持,但不推荐在生产中使用。 -
constructor属性容易被修改或丢失,不可靠。 - 不要依赖
instanceof来判断任意两个对象之间的原型关系,它只适用于构造函数与实例之间,且跨执行上下文(如 iframe)会失效。
基本上就这些。优先使用 isPrototypeOf(),它标准、安全、语义明确。手动遍历适合理解原理或特殊场景。










