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

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo