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 相关文章推荐
客户端脚本中常常出现的一些问题和调试技巧
Jan 09 Javascript
Prototype使用指南之hash.js
Jan 10 Javascript
jquery 双色表格实现代码
Dec 08 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
jQuery $命名冲突解决方案汇总
Nov 13 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
Mar 03 Javascript
AngularJS Select(选择框)使用详解
Jan 18 Javascript
javascript设计模式之策略模式学习笔记
Feb 15 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
Feb 19 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
Jun 27 Javascript
原生JavaScript实现幻灯片效果
Feb 19 Javascript
JavaScript原型链详解
JavaScript组合继承详解
详细聊聊vue中组件的props属性
教你一步步实现一个简易promise
Nov 02 #Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
You might like
数据库的日期格式转换
2006/10/09 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
js获取Get值的方法
2016/09/29 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
Python中for循环控制语句用法实例
2015/06/02 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
Django实现单用户登录的方法示例
2019/03/28 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
海外淘书首选:AbeBooks
2017/07/31 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
比较基础的php面试题及答案-填空题
2014/04/26 面试题
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python