instanceof的原理是什么?手写instanceof方法

2024-03-26 03:20

本文主要是介绍instanceof的原理是什么?手写instanceof方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

instanceof 的含义

instanceof 运算符 是 JavaScript 中用于检测 一个对象 是否是其构造函数的 prototype 属性指向的原型链上的实例。
(简单记:用于检查一个对象是否是指定构造函数的 prototype 原型链上的实例。)

实现思路

输入一个对象,一个构造函数;通过循环遍历对象的原型链,逐级检查是否与给定构造函数的原型相匹配,从而判断对象是否是由特定构造函数创建的。

核心代码

function myInstanceOf(obj, constructor) {if (typeof constructor !== "function" || constructor === null) {throw new Error("类型输入错误");}let proto = Object.getPrototypeOf(obj); // 获取obj的原型,相当于obj.__proto__while (proto) { // 循环检查原型链,直到原型链的末端 Object.prototype 或 nullif (proto === constructor.prototype) { // 如果找到匹配的构造函数,返回 truereturn true;}proto = Object.getPrototypeOf(proto); // 继续向上查找原型,相当于proto.__proto__;}return false;
}
// 使用示例  
function MyObject() {}  
const obj = new MyObject();  
console.log(myInstanceOf(obj, MyObject)); // 输出: true  
console.log(myInstanceOf(obj, Array));    // 输出: false

这个实现假设所有对象都是通过 new 关键字创建的,并且它们的原型链最终会指向 null 或 Object.prototype。
判断条件只要求输入object类型时,判断条件改为:

// 如果 object 不是对象,返回 false  
if (typeof object !== 'object' || object === null) {  return false;  
} 

测试结果:

console.log('typeof Object:',typeof Object) // function
console.log('1'.constructor)
console.log([].constructor)
console.log({}.constructor)

控制台运行结果:

typeof Object: function
instancesOf的实现.html:50 ƒ String() { [native code] }
instancesOf的实现.html:51 ƒ Array() { [native code] }
instancesOf的实现.html:52 ƒ Object() { [native code] }

补充知识:Object.getPrototypeOf()

Object.getPrototypeOf(xx),用于获取指定对象的原型(即原型链的上一层对象),相当于xx.proto,查找xx的原型

console.log(Object.getPrototypeOf(Object.prototype) === null); // true
const array = [];
console.log(array.__proto__ === Array.prototype) // __proto__指向其构造函数的prototype属性, true
console.log(Object.getPrototypeOf(array) === Array.prototype); // trueconst date = new Date();
console.log(Object.getPrototypeOf(date) === Date.prototype); // true

这篇关于instanceof的原理是什么?手写instanceof方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847132

相关文章

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直