本文详细解析JavaScript中isPrototypeOf函数的作用,该函数用于判断一个对象是否存在于另一个对象的原型链上。文章通过Object类、自定义类及内置类的多个示例,阐述原型链的核心机制,并对比isPrototypeOf与instanceof在判断实例关系时的异同,帮助开发者深入理解JavaScript面向对象编程中的原型继承概念。
在研读部分框架源码时,开发者可能会遇到 isPrototypeOf() 这一方法,它究竟承担什么职责?
1、isPrototypeOf()方法概述
isPrototypeOf() 作为 Object对象的一个内置方法,主要用于检测当前对象是否位于另一个对象的原型链中。若存在该关系则返回 true,反之则返回 false。
掌握此方法的核心在于理解原型链机制,这常被视作JavaScript进阶学习的难点之一。
此处不展开底层原理,主要归纳为以下三个关键点:
- 1. 所有函数对象均内置一个
prototype属性。 - 2. 每个对象实例均内置一个
__proto__属性,该属性指向创建该对象的函数对象的prototype。 - 3. 函数对象的
prototype属性同样包含一个__proto__,指向创建该函数的对象的prototype。
示例1,基于Object类的实例测试:
let o = new Object();
console.log(Object.prototype.isPrototypeOf(o)); // true
由于o是Object的实例,因此该对象的原型(__proto__)指向Object的prototype,执行上述逻辑将输出true。
示例2,自定义Human类的测试:
function Human() {}
let human = new Human();
console.log(Human.prototype.isPrototypeOf(human)); // true
此例与前述类似,因human是Human的实例,故human的原型(__proto__)指向Human的prototype,代码执行结果输出true。
示例3,验证Object的原型(prototype)是否属于human的原型:
console.log(Object.prototype.isPrototypeOf(human)); // true
通过代码推导可能更为直观,参考以下逻辑:
// 因为 Human 的原型(prototype)中的原型(__proto__)指向 Object 的原型(prototype)
Human.prototype.__proto__ === Object.prototype
// 又因为 human 的原型(__proto__)指向 Human 的原型(prototype)
huamn.__proto__ === Human.prototype
// 所以human对象的原型(__proto__)的原型(__proto__)指向Object的原型(prototype)
huamn.__proto__.__proto__ === Object.prototype
若观察human的结构,情况将变得清晰:

那么 Object 的prototype 是否等同于 human 的原型?准确而言,Object 的prototype位于 human 的原型链之中。
示例4,验证Object.prototype是否为内置类的原型:
在JavaScript中,内置类Number、String、Boolean、Function、Array均继承自Object,因此以下测试均输出true:
console.log(Object.prototype.isPrototypeOf(Number)); // true
console.log(Object.prototype.isPrototypeOf(String)); // true
console.log(Object.prototype.isPrototypeOf(Boolean)); // true
console.log(Object.prototype.isPrototypeOf(Array)); // true
console.log(Object.prototype.isPrototypeOf(Function)); // true
由此可见,Object.prototype同样是Number、String、Boolean、Function、Array实例的原型。
示例5,验证Object作为函数的特性:
值得注意的是,Function.prototype 也是Object的原型,因为Object本身也是一个函数(类),二者互为生成关系。
参考以下执行结果:
console.log(Object.prototype.isPrototypeOf(Function)); // true console.log(Function.prototype.isPrototypeOf(Object)); // true
2、与 instanceof 运算符的区别
instanceof 用于判断对象是否属于某个类的实例。
例如:
function Human() {}
let human = new Human();
// human 是 Human 的实例,所以结果输出true
console.log(human instanceof Human); // true
// 因为所有的类都继承Object,所以结果也输出true
console.log(human instanceof Object); // true
// 因为 human 对象不是数组,所以结果输出false
console.log(human instanceof Array); // false
补充几个内置类的测试用例:
// 【1,2,3] 是 Array 的实例,所以输出true
console.log([1, 2, 3] instanceof Array); // true
// 方法 function(){} 是 Function的实例,所以输出true
console.log(function(){} instanceof Function);
instanceof 的作用原理是检查实例的原型链中是否包含类的原型对象(prototype),而 isPrototypeOf 则是判断类的原型对象(prototype)是否位于实例的原型链上。
基于此理解,两者的语义一致,仅语法形式不同,以下两组输出应当等效:
console.log(A instanceof B);
console.log(B.prototype.isPrototypeOf(A));
小结
深入理解 isPrototypeOf 函数的关键在于透彻掌握原型链的概念。
至此,关于JavaScript中isPrototypeOf函数的介绍完毕,更多相关JavaScript中isPrototypeOf内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!