判断对象是否继承自某个原型最可靠的方式是 Object.prototype.isPrototypeOf(),它直接检测原型对象是否存在于目标对象的原型链中,返回布尔值,语义清晰、不依赖构造函数,跨上下文稳定。

判断对象是否继承自某个原型,最可靠的方式是使用 Object.prototype.isPrototypeOf() 方法。
用 isPrototypeOf() 检查原型关系
该方法用于检测调用者(一个原型对象)是否存在于目标对象的原型链中。返回布尔值,语义清晰、不依赖构造函数,适用于所有情况。
-
Array.prototype.isPrototypeOf([])→ true -
Array.prototype.isPrototypeOf({})→ false -
EventTarget.prototype.isPrototypeOf(new Event('click'))→ true
注意不要混淆 instanceof
instanceof 看似类似,但它依赖右侧操作数的 prototype 属性,且在跨 iframe 或不同执行上下文时可能失效(因构造函数不共享)。而 isPrototypeOf() 直接比对原型对象本身,更底层、更稳定。
- ✅ 推荐:
MyClass.prototype.isPrototypeOf(obj) - ⚠️ 谨慎:
obj instanceof MyClass(尤其涉及模块隔离或动态加载时)
手动遍历原型链(仅作理解,不推荐生产使用)
可通过 Object.getPrototypeOf() 逐级向上取原型,直到为 null,途中匹配目标原型:
立即学习“Java免费学习笔记(深入)”;
function hasPrototype(obj, proto) {
let current = obj;
while (current !== null) {
if (current === proto) return true;
current = Object.getPrototypeOf(current);
}
return false;
}
这本质上是 isPrototypeOf() 的手动实现,但没必要重复造轮子。
区分 hasOwnProperty 和原型检查
obj.hasOwnProperty('prop') 只判断属性是否在对象自身,和原型链继承无关。它不能替代原型关系判断,别误用。
-
{a: 1}.__proto__.hasOwnProperty('toString')→ true(toString在Object.prototype上) - 但这不代表
{a: 1}“继承自”Object.prototype—— 实际上它确实继承,但hasOwnProperty不是用来回答这个问题的


















