JavaScript中isPrototypeOf函数详解

有时看一些框架源码的时候,会碰到 isPrototypeOf() 这个函数,那么这个函数有什么作用呢?

isPrototypeOf()

isPrototypeOf() 是 Object函数(类)的下的一个方法,用于判断当前对象是否为另外一个对象的原型,如果是就返回 true,否则就返回 false。

这个函数理解的关键是在原型链上,这个据说是JavaScript的三座大山之一。

这里不详述其中的原理,简单的来讲就是3点:

11. 函数对象,都会天生自带一个prototype原型属性。 22. 每一个对象也天生自带一个属性__proto__指向生成它的函数对象的prototype。 33. 函数对象的prototype也有__proto__指向生成它的函数对象的prototype。

示例1,Object类实例:

1let o = new Object(); 2console.log(Object.prototype.isPrototypeOf(o)); // true

因为o对象是Object的实例,所以o对象的原型(__proto__)指向Object的原型(prototype),上面会输出true。

示例2,自己定义Human类:

1function Human() {} 2let human = new Human(); 3 4console.log(Human.prototype.isPrototypeOf(human)); // true

这例和上例类似,因为human对象是Human的实例,所以human对象的原型(__proto__)指向Human的原型(prototype),上面会输出true。

示例3,再来看看Object的原型(prototype)是否是human的原型:

1console.log(Object.prototype.isPrototypeOf(human)); // true

为什么呢?,用代码可能更好解释,请看下面推导:

1// 因为 Human 的原型(prototype)中的原型(__proto__)指向 Object 的原型(prototype) 2Human.prototype.__proto__ === Object.prototype 3// 又因为 human 的原型(__proto__)指向 Human 的原型(prototype) 4huamn.__proto__ === Human.prototype 5// 所以human对象的原型(__proto__)的原型(__proto__)指向Object的原型(prototype) 6huamn.__proto__.__proto__ === Object.prototype

如果查看human的结构就很容易清楚了:

1

那 Object 的原型(prototype) 是不是就是 human 对象的原型呢?确切的说Object 的原型(prototype)是在 human 的原型链上。

示例4,Object.prototype是否是内置类的原型:

JavaScript中内置类Number、String、Boolean、Function、Array因为都是继承Object,所以下面的输出也都是true:

1console.log(Object.prototype.isPrototypeOf(Number)); // true 2console.log(Object.prototype.isPrototypeOf(String)); // true 3console.log(Object.prototype.isPrototypeOf(Boolean)); // true 4console.log(Object.prototype.isPrototypeOf(Array)); // true 5console.log(Object.prototype.isPrototypeOf(Function)); // true

自然Object.prototype也是Number、String、Boolean、Function、Array的实例的原型。

示例5,Object也是函数(类):

另外值得一提的是 Function.prototype 也是Object的原型,因为Object也是一个函数(类),它们是互相生成的。

请看下面输出:

1console.log(Object.prototype.isPrototypeOf(Function)); // true 2console.log(Function.prototype.isPrototypeOf(Object)); // true

和 instanceof 的区别

instanceof 是用来判断对象是否属于某个对象的实例。

例如:

1function Human() {} 2let human = new Human(); 3 4// human 是 Human 的实例,所以结果输出true 5console.log(human instanceof Human); // true 6 7// 因为所有的类都继承Object,所以结果也输出true 8console.log(human instanceof Object); // true 9 10// 因为 human 对象不是数组,所以结果输出false 11console.log(human instanceof Array); // false

再来一些内置类的例子:

1// 【1,2,3] 是 Array 的实例,所以输出true 2console.log([1, 2, 3] instanceof Array); // true 3 4// 方法 function(){} 是 Function的实例,所以输出true 5console.log(function(){} instanceof Function);

instanceof 作用的原理就是判断实例的原型链中能否找到类的原型对象(prototype),而 isPrototypeOf 又是判断类的原型对象(prototype)是否在实例的原型链上。

所以我的理解,这两个表达的意思是一致的,就是写法不同,下面两个输出应该是一致的:

1console.log(A instanceof B); 2console.log(B.prototype.isPrototypeOf(A));

小结

其实要理解 isPrototypeOf 函数,关键是要理解原型链这个玩意。

点赞
收藏

评论区

加载中...

相关推荐

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

一篇文章带你了解JavaScript作用域

在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann

一篇文章带你了解JavaScript Object 对象

一、概念JavaScript原生提供Object对象(注意起首的O是大写),介绍该对象原生的各种方法。JavaScript的所有其他对象都继承自Object对象,即那些对象都是Object的实例。二、Object()Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。如果参数为空(或者为undefi

JS 对象数组Array 根据对象object key的值排序sort,很风骚哦

有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak