首页IT科技js手写call(JavaScript之instanceof方法手写示例详解)

js手写call(JavaScript之instanceof方法手写示例详解)

时间2025-07-30 14:36:16分类IT科技浏览4838
导读:方法介绍 instanceof 是什么?...

方法介绍

instanceof 是什么?

用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上              。

语法:object instanceof

constructor

object:某个实例对象

constructor:某个构造函数

简言之就是用来检测 constructor.prototype 是否存在于参数 object 的原型链上                    。

个人理解:

instanceof 是用来判断左侧对象是否是右侧构造函数的实例化对象             ,或则说左侧对象能否通过其隐式原型 **[[proto]]**在原型链上一层层向上查找到右侧函数的原型对象                     ,即函数原型对象出现在实例对象的原型链上就返回 true       。

通俗的理解: 右侧是不是左侧的爸爸              、爷爷                    、祖宗       ,只要左侧对象继承自右侧函数就为 true

instanceof 使用方式

object instanceof 构造函数             , 它有两个必传参数                    ,左侧必须为对象类型       ,右侧必须为函数类型       。返回值为 Boolean 类型

注意: 你可能会认为js中万物皆对象       ,这个错误的理解可能会误导大家出现这种写法: str instanceof String                    ,返回值为false              ,因为 ‘str’ 就是简单的字符串       ,它和通过String构造函数(new String(str))创造出来的字符串是有区别的                    ,可自行在控制台打印出来看              ,其值会封装成String对象类型的字符串,同理 new Number(3) instanceof Number, new Boolean(true) instanceof Boolean ……等等返回值为true                    。

代码示例:

// 定义构造函数 function C () {} function D () {} // 实例化一个 o 对象 var o = new C() // true                    ,true --> C.prototype 在 o 的原型链上 console.log(o instanceof C, o.__proto__ === C.prototype, 此时 o 的 __proto__:, o.__proto__, 此时 C 的 prototype:, C.prototype) // false                     ,false --> D.prototype 不在 o 的原型链上 console.log(o instanceof D, o.__proto__ === D.prototype) // true true --> Object.prototype 在 o 的原型链上 console.log(o instanceof Object, o.__proto__.__proto__ === Object.prototype) // 这时我们修改构造函数 C 的原型为一个空对象 C.prototype = {} // 实例化一个 o2 对象 var o2 = new C() // true --> C.prototype 在 o2 的原型链上 console.log(o2 instanceof C) // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上. console.log(o instanceof C, 此时 o 的 __proto__:, o.__proto__, 此时 C 的 prototype:, C.prototype) console.log(此时 D 的 prototype:, D.prototype); // 继承 D.prototype = new C() console.log(此时 D 的 prototype:, D.prototype); var o3 = new D() // true, true --> 因为 o3 是 构造函数 D new 出来的实例对象             ,所以 D.prototype 一定在 o3 的原型链上 console.log(o3 instanceof D, o3.__proto__ === D.prototype) // true --> 因为 C.prototype 现在在 o3 的原型链上 console.log(o3 instanceof C) // true,true --> 上面的结果为什么为 true 呢                     ,看如下代码       ,D.prototype 是 构造函数 C new 出来的实例对象             ,所以 C.prototype 一定在 D.prototype 的原型链上 console.log(o3.__proto__ === D.prototype, D.prototype.__proto__ === C.prototype); // true 相当于如下代码 console.log(o3.__proto__.__proto__ === C.prototype);

开始手写

由上我们可以知道                    ,instanceof其判断的原理是:通过左侧对象的隐式原型属性 __ proto __ 在原型链上向上一层层查找       ,找到右侧构造函数的原型对象属性 prototype 就返回 true             。明白这一点也就很容易写出自己的 instanceof       。

注:需要借助循环来实现                     。

function myInstanceof(obj, func) { if(![function, object].includes(typeof obj) || obj === null) { // 基本数据类型直接返回false       ,因为不满足instanceof的左侧参数是对象或者说引用类型 return false } let objProto = obj.__proto__, funcProto = func.prototype while(objProto !== funcProto) { // obj.__proto__不等于func.prototype时                    ,继续通过__proto__向上层查找 // 当找到原型链尽头Object.prototype.__proto__=null 时还未找到              ,就返回false objProto = objProto.__proto__ if(objProto === null){ return false } } // obj.__proto__ 等于 prototype = func.prototype 时       ,不会进入上面循环                    ,返回true // 不等进入上面循环              ,找到相等时会跳出循环,走到这里返回true return true } //测试 function A(){} let a=new A; console.log(myInstanceof(a,A))//true console.log(myInstanceof([],A))//false

以上就是JavaScript之instanceof方法手写示例详解的详细内容                    ,更多关于JavaScript instanceof 方法的资料请关注本站其它相关文章!

声明:本站所有文章                     ,如无特殊说明或标注,均为本站原创发布             。任何个人或组织             ,在未征得本站同意时                     ,禁止复制       、盗用       、采集                    、发布本站内容到任何网站             、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益       ,可联系我们进行处理                     。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
howtousetheinternet作文60(How to use ActiveRecord without Rails) vue3.0变化(Vue项目新一代状态管理工具Pinia的使用教程)