在js中,对象的原型类型检测是处理继承、判断对象类别时的常见需求,不同的检测方法基于原型链原理有不同的实现逻辑和适用边界。

常见原型类型检测方法
1. instanceof 操作符
instanceof 是最常用的原型检测方式之一,它的判断逻辑是:检查构造函数的 prototype 属性是否出现在对象的原型链上。
基本语法为:对象 instanceof 构造函数,返回布尔值。
// 定义构造函数
function Person(name) {
this.name = name;
}
// 创建实例
const p = new Person('张三');
// 判断p是否为Person的实例
console.log(p instanceof Person); // true
// 所有对象最终都继承自Object
console.log(p instanceof Object); // true
// 普通对象不是Array的实例
console.log(p instanceof Array); // false
注意:instanceof 只能用于检测对象类型,不能检测基本数据类型,比如 1 instanceof Number 会返回 false,因为 1 是基本数字,不是 Number 构造函数的实例。
2. isPrototypeOf 方法
isPrototypeOf 是 Object 原型上的方法,用于判断一个对象是否存在于另一个对象的原型链中,和 instanceof 的判断逻辑相反。
基本语法为:原型对象.isPrototypeOf(待检测对象),返回布尔值。
function Animal() {}
function Dog() {}
// 设置Dog的原型为Animal的实例,形成继承
Dog.prototype = Object.create(Animal.prototype);
const dog = new Dog();
// Animal的原型在dog的原型链上
console.log(Animal.prototype.isPrototypeOf(dog)); // true
// Dog的原型是dog的直接原型
console.log(Dog.prototype.isPrototypeOf(dog)); // true
// Object的原型在所有对象的原型链上
console.log(Object.prototype.isPrototypeOf(dog)); // true
3. Object.getPrototypeOf 方法
Object.getPrototypeOf 可以获取一个对象的直接原型(也就是对象的 __proto__ 指向的对象),通过对比原型可以直接判断类型。
基本语法为:Object.getPrototypeOf(对象),返回对象的直接原型。
const arr = [];
// 获取arr的直接原型
const proto = Object.getPrototypeOf(arr);
// 对比Array的原型
console.log(proto === Array.prototype); // true
// 对比Object的原型
console.log(proto === Object.prototype); // false
// 多层原型链的场景
function Parent() {}
function Child() {}
Child.prototype = Object.create(Parent.prototype);
const child = new Child();
// child的直接原型是Child.prototype
console.log(Object.getPrototypeOf(child) === Child.prototype); // true
// Child.prototype的直接原型是Parent.prototype
console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype); // true
4. constructor 属性检测
对象的 constructor 属性指向创建该对象的构造函数,通过对比 constructor 也可以判断原型类型,但这种方式不够稳定,因为 constructor 属性可以被修改。
const num = new Number(10);
// 查看num的构造函数
console.log(num.constructor === Number); // true
// 修改构造函数的prototype后,constructor会丢失
function Test() {}
Test.prototype = {};
const t = new Test();
// 此时constructor指向Object,因为空对象的constructor是Object
console.log(t.constructor === Test); // false
console.log(t.constructor === Object); // true
不同方法的适用场景对比
| 检测方法 | 核心逻辑 | 优点 | 缺点 |
|---|---|---|---|
| instanceof | 构造函数prototype是否在对象原型链上 | 语法简洁,适合判断实例归属 | 不能检测基本类型,跨iframe场景失效 |
| isPrototypeOf | 对象是否在另一个对象原型链上 | 逻辑更直观,适合原型链判断 | 需要明确原型对象,不能直接写构造函数 |
| Object.getPrototypeOf | 获取对象直接原型后对比 | 可以精确获取原型,灵活度高 | 需要手动对比,步骤稍多 |
| constructor | 对比对象构造函数 | 可以直接获取构造函数信息 | constructor易被修改,稳定性差 |
注意事项
- instanceof 在跨执行环境(比如不同iframe)的场景下会失效,因为不同环境下的构造函数 prototype 不是同一个对象。
- 使用 constructor 检测时,如果构造函数的 prototype 被重新赋值,会导致 constructor 指向错误,不建议作为主要的检测方式。
- 如果需要检测对象的具体类型(比如数组、日期等),优先使用
Array.isArray()、Object.prototype.toString.call()等更精准的方法,原型检测更适合判断继承关系。
原型链是js继承的核心机制,理解不同原型检测方法的原理,才能在开发中准确判断对象的原型类型,避免因为判断错误引发的逻辑bug。
js原型检测instanceofObject_getPrototypeOfisPrototypeOf修改时间:2026-07-16 22:30:30