JavaScript中isPrototypeOf函数


Posted in Javascript onNovember 07, 2021

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

1、isPrototypeOf()

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

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

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

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

示例1,Object类实例:

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

因为o对象是Object的实例,所以o对象的原型(__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的结构就很容易清楚了:

JavaScript中isPrototypeOf函数

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

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

JavaScript中内置类NumberStringBooleanFunctionArray因为都是继承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也是NumberStringBooleanFunctionArray的实例的原型。

示例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 函数,关键是要理解原型链这个玩意。

到此这篇关于JavaScriptisPrototypeOf函数的文章就介绍到这了,更多相关JavaScript中isPrototypeOf内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
一个背景云变换js特效 鼠标移动背景云变化
Dec 28 Javascript
javascript 使用 NodeList需要注意的问题
Mar 04 Javascript
基于datagrid框架的查询
Apr 08 Javascript
js+html5实现canvas绘制镂空字体文本的方法
Jun 05 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
Sep 16 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
Vuex之理解Store的用法
Apr 19 Javascript
详解 vue.js用法和特性
Oct 15 Javascript
原生JS实现的简单轮播图功能【适合新手】
Aug 17 Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
Mar 17 Javascript
JavaScript原型链详解
JavaScript组合继承详解
详细聊聊vue中组件的props属性
教你一步步实现一个简易promise
Nov 02 #Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
You might like
php实现图片添加水印功能
2014/02/13 PHP
php分页代码学习示例分享
2014/02/20 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
php排序算法实例分析
2016/10/17 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
JObj预览一个JS的框架
2008/03/13 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
解析Python中的二进制位运算符
2015/05/13 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
使用tensorflow实现线性svm
2018/09/07 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Python for循环与getitem的关系详解
2020/01/02 Python
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
甜点店创业计划书
2014/01/27 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
语文复习计划
2015/01/19 职场文书
听证通知书
2015/04/24 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏