isprototypeof用于检测原型链继承关系,调用者须为有效原型对象,参数须为对象,不可用于类型判断或替代instanceof。

isPrototypeOf 用于检测一个对象是否存在于另一个对象的原型链上,它不是构造函数或实例的“类型判断工具”,而是专门检查原型链上的继承关系。正确使用的关键在于明确调用主体、参数顺序和对象有效性。
调用主体必须是原型对象(非 undefined 或 null)
isPrototypeOf 是 Object.prototype 上的方法,只能由可能作为原型的对象调用。常见错误是让 null、undefined 或原始值(如数字、字符串字面量)调用它,会直接报错或返回 false。
- ✅ 正确:`Array.prototype.isPrototypeOf([])` → true
- ✅ 正确:`EventTarget.prototype.isPrototypeOf(new Event('click'))` → true
- ❌ 错误:`null.isPrototypeOf(obj)` → TypeError
- ❌ 错误:`(123).isPrototypeOf(obj)` → TypeError(原始值无方法)
参数是待检测的目标对象,且必须是对象类型
isPrototypeOf 的唯一参数是你想确认“是否被当前原型链覆盖”的那个对象。它会沿着该对象的 [[Prototype]] 链向上查找,看能否找到调用者。
- ✅ 正确:`Date.prototype.isPrototypeOf(new Date())` → true
- ✅ 正确:`Object.prototype.isPrototypeOf({})` → true(所有对象都继承自 Object.prototype)
- ⚠️ 注意:`Object.prototype.isPrototypeOf(null)` → false(null 没有原型链)
- ⚠️ 注意:`Object.prototype.isPrototypeOf("hello")` → false(原始字符串不是对象,会临时包装但不参与原型链检测)
不适用于 class 继承关系的“静态断言”
虽然 class 语法底层仍基于原型,但 isPrototypeOf 检查的是运行时原型链,不是类声明结构。不要用它替代 instanceof 来做常规类型判断。
- ✅ 可用场景:调试原型链是否按预期连接,比如验证自定义 prototype 是否被正确设置
- ❌ 不推荐:`MyClass.prototype.isPrototypeOf(instance)` 替代 `instance instanceof MyClass` —— 后者更语义清晰、支持 Symbol.hasInstance 且可被重写
- ? 提示:若 MyClass 修改了 prototype,或 instance 是通过 Object.create(null) 创建的,则 isPrototypeOf 行为与 instanceof 明显不同
安全调用建议:先校验再执行
在不确定原型对象或目标对象是否有效时,应主动防护,避免运行时错误。
- 用
typeof obj === 'object' && obj !== null确保参数是对象 - 对原型侧,可用
proto != null && typeof proto === 'object'判断是否可调用 - 封装工具函数示例:
function checkPrototype(proto, target) {<br> return proto && typeof proto === 'object' &&<br> target != null && typeof target === 'object' &&<br> proto.isPrototypeOf(target);<br> }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











