instanceof的功能和原理怎么理解,如何手动实现instanceof
Admin 2022-06-22 群英技术资讯 1121 次浏览
这篇文章给大家分享的是“instanceof的功能和原理怎么理解,如何手动实现instanceof”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。
function Person() {}
function Person2() {}
const usr = new Person();
console.log(usr instanceof Person); // true
console.log(usr instanceof Object); // true
console.log(usr instanceof Person2); // false
如上代码,定义了两个构造函数,Person和Person2,又实用new操作创建了一个Person的实例对象usr。
实用instanceof操作符,分别检验构造函数的prototype属性是否在usr这个实例的原型链上。
当然,结果显示,Person和Object的prototype属性在usr的原型链上。usr不是Person2的实例,故Person2的prototype属性不在usr的原型链上。
明白了instanceof的功能和原理后,可以自己实现一个instanceof同样功能的函数:
function myInstanceof(obj, constructor) {
// obj的隐式原型
let implicitPrototype = obj?.__proto__;
// 构造函数的原型
const displayPrototype = constructor.prototype;
// 遍历原型链
while (implicitPrototype) {
// 找到,返回true
if (implicitPrototype === displayPrototype) return true;
implicitPrototype = implicitPrototype.__proto__;
}
// 遍历结束还没找到,返回false
return false;
}
myInstanceof函数接收两个参数:实例对象obj和构造函数constructor。
首先拿到实例对象的隐式原型:obj.__proto__,构造函数的原型对象constructor.prototype。
接着,就可以通过不断得到上一级的隐式原型:
implicitPrototype = implicitPrototype.__proto__;
来遍历原型链,寻找displayPrototype是否在原型链上,若找到,返回true。
当implicitPrototype为null时,结束寻找,没有找到,返回false。
原型链其实就是一个类似链表的数据结构。
instanceof做的事,就是在链表上寻找有没有目标节点。从表头节点开始,不断向后遍历,若找到目标节点,返回true。遍历结束还没找到,返回false。
写一个简单的实例验证一下自己实现的instanceof:
function Person() {}
function Person2() {}
const usr = new Person();
function myInstanceof(obj, constructor) {
let implicitPrototype = obj?.__proto__;
const displayPrototype = constructor.prototype;
while (implicitPrototype) {
if (implicitPrototype === displayPrototype) return true;
implicitPrototype = implicitPrototype.__proto__;
}
return false;
}
myInstanceof(usr, Person); // true
myInstanceof(usr, Object); // true
myInstanceof(usr, Person2); // false
myInstanceof(usr, Function); // false
myInstanceof(usr.__proto__, Person); // false
usr.__proto__ instanceof Person; // false
可以看到,myInstanceof正确得出了结果。
有趣的是,usr.__proto__ instanceof Person返回false,说明obj instanceof constructor检测的原型链,不包括obj节点本身。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
方法:1、用“document.getElementById("id值")”语句根据id值获取h2元素对象;2、使用“h2元素对象.innerHTML="新标题内容"”或“h2元素对象.innerText="新标题内容"”语句进行修改即可。
JavaScript自定义日历实现签到功能 本文实例为大家分享了JavaScript自定义日历签到功能的具体代码,供大家参考,具体内容如下 先看下效果图 红色块为已签到的日期,样式可以随意更改,清晰明了,话不多说上代码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String bas ...
本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了JavaScript变量or循环中的var和let详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,下面一起来看一下,希望对大家有帮助。
这篇文章主要为大家介绍了React.js前端导出Excel的方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
JavaScript 异步函数 Promisification 处理详情 前言: Promisification 是一个很长的词,表示一个编程范式的转变,即将接受回调的函数转换为一个返回类型为 Promise 的函数. 我们现实的开发项目中经常需要这种转换,因为许多函数和库都是基于回调的,但是 Promise 更方便
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008