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 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
JavaScript 学习笔记二 字符串拼接
Mar 28 Javascript
现如今最流行的JavaScript代码规范
Mar 08 Javascript
批量修改标签css样式以input标签为例
Jul 31 Javascript
jQuery实现点击图片翻页展示效果的方法
Feb 16 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
JavaScript纯色二维码变成彩色二维码
Jul 23 Javascript
微信小程序开发背景图显示功能
Aug 08 Javascript
浅谈VUE中演示v-for为什么要加key
Jan 16 Javascript
vue+element ui实现锚点定位
Jun 29 Vue.js
JavaScript原型链详解
JavaScript组合继承详解
详细聊聊vue中组件的props属性
教你一步步实现一个简易promise
Nov 02 #Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
You might like
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
php学习笔记之基础知识
2014/11/08 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
2013/05/08 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
Tensorflow简单验证码识别应用
2017/05/25 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
django加载本地html的方法
2018/05/27 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
详解python程序中的多任务
2020/09/16 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
护士辞职信模板
2014/01/20 职场文书
关于期中考试的反思
2014/02/02 职场文书
体育之星事迹材料
2014/05/11 职场文书
洗手间标语
2014/06/23 职场文书
合作意向协议书
2015/01/29 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS