最常用且标准的方法是使用 instanceof 操作符或 object.prototype.isprototypeof() 方法;instanceof 判断对象原型链是否包含构造函数的 prototype,isprototypeof 直接检查某原型对象是否在目标对象原型链中,二者均可靠,而 constructor 属性判断不可靠。

在 JavaScript 中,检查一个对象是否“属于”某个原型对象(即该对象的原型链中是否包含指定的构造函数的 prototype),最常用且标准的方法是使用 instanceof 操作符或 Object.prototype.isPrototypeOf() 方法。
用 instanceof 判断构造函数关系
instanceof 会沿着对象的原型链向上查找,看是否能找到右侧构造函数的 prototype 属性所指向的对象。
- 语法:
obj instanceof Constructor - 返回
true表示obj的原型链中包含Constructor.prototype - 注意:右侧必须是函数(有
prototype属性),否则报错
例如:
const arr = [1, 2];console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true(Array.prototype 继承自 Object.prototype)
用 isPrototypeOf() 直接检查原型存在性
如果你已有某个原型对象(比如 Array.prototype),想确认它是否在目标对象的原型链中,就用 isPrototypeOf:
- 语法:
prototypeObj.isPrototypeOf(obj) - 更底层、更灵活,不要求原型对象来自构造函数
- 右侧可以是任意对象(包括手动创建的普通对象)
例如:
const arr = [1, 2];console.log(Array.prototype.isPrototypeOf(arr)); // true
console.log(Object.prototype.isPrototypeOf(arr)); // true
// 自定义原型链
const parent = {};
const child = Object.create(parent);
console.log(parent.isPrototypeOf(child)); // true
避免用 constructor 属性判断
obj.constructor === SomeClass 不可靠,因为:
-
constructor属性可被改写(如Child.prototype.constructor = Parent) - ES6 class 或箭头函数等场景下容易丢失或不准确
- 原型链上可能有多个 constructor,语义模糊
补充:检查是否“直接”是某原型(非原型链中)
如果只关心对象的 直接原型(即 Object.getPrototypeOf(obj) === somePrototype),可用:
Object.getPrototypeOf(obj) === SomeConstructor.prototype- 或
Object.getPrototypeOf(obj) === someProtoObj
这比 instanceof 更严格,不涉及整条原型链。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











