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 相关文章推荐
ajax java 实现自动完成功能
Dec 19 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
js动态获取子复选项并设计全选及提交的实现方法
Jun 24 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
jquery实现自适应banner焦点图
Feb 16 Javascript
JS触摸与手势事件详解
May 09 Javascript
Node.js 8 中的重要新特性
Jun 28 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
May 15 Javascript
JS中call()和apply()的功能及用法实例分析
Jun 28 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
Sep 02 Javascript
详解关于Vue单元测试的几个坑
Apr 26 Javascript
JavaScript实现网页计算器功能
Oct 29 Javascript
JavaScript原型链详解
JavaScript组合继承详解
详细聊聊vue中组件的props属性
教你一步步实现一个简易promise
Nov 02 #Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
You might like
Apache2 httpd.conf 中文版
2006/12/06 PHP
PHP版自动生成文章摘要
2008/07/23 PHP
教你php如何实现验证码
2016/01/20 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
jQuery代码优化之基本事件
2011/11/01 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
js实现内置计时器
2019/12/16 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
全面理解Python中self的用法
2016/06/04 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
Android interview questions
2016/12/25 面试题
模具专业推荐信
2013/10/30 职场文书
捐书倡议书
2014/08/29 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
重阳节活动主持词
2015/07/04 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL