最直接可靠的方式是用 instanceof 运算符,它通过检查对象原型链是否包含指定构造函数的 prototype 来判断实例关系,支持继承且跨 iframe 场景下更稳定。

最直接可靠的方式是用 instanceof 运算符。它专门为此设计:检查对象的原型链上是否存在指定构造函数的 prototype。
用 instanceof 判断实例关系
语法简单,语义明确:
-
obj instanceof Constructor返回true,说明obj是Constructor或其子类的实例 - 底层机制是沿着
obj.__proto__一路向上查找,直到匹配到Constructor.prototype或到达原型链顶端 - 支持继承链判断:若
Student继承自Person,则new Student() instanceof Person也为true
constructor 属性可作辅助参考,但不推荐单独使用
obj.constructor === Constructor 看似直观,但有明显局限:
- 容易被手动修改:
obj.constructor = null或重写原型后失效 - 在继承中若未正确修复
constructor(如忘记设Sub.prototype.constructor = Sub),结果会错误 - 跨 iframe 场景下,不同全局环境中的
Array构造函数不相等,arr.constructor === Array可能为false,而arr instanceof Array仍可正常工作(取决于当前执行上下文)
注意基本类型和包装对象的区别
字面量不是实例,只有显式用 new 创建的才是:
立即学习“Java免费学习笔记(深入)”;
-
"abc" instanceof String→false(字符串字面量是基本类型) -
new String("abc") instanceof String→true - 同理:
42 instanceof Number为false;new Number(42) instanceof Number才为true
更健壮的替代方案(按场景选择)
当需要更高兼容性或处理边界情况时:
- 检测数组:优先用
Array.isArray(obj),比obj instanceof Array更安全(尤其跨 iframe) - 检测内置对象如 Date、RegExp:仍可用
obj instanceof Date,但通用性更强的是Object.prototype.toString.call(obj) === "[object Date]" - 自定义类实例:只要没篡改原型链,
instanceof是首选,简洁且语义清晰


















