我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript之instanceof方法手写示例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript之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 方法的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript之instanceof方法手写示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript之instanceof方法手写示例详解

这篇文章主要为大家介绍了JavaScript之instanceof方法手写示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

通过手写instanceof理解原型链示例详解

这篇文章主要为大家介绍了通过手写instanceof理解原型链示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-19

SpringJPA之save方法示例详解

这篇文章主要为大家介绍了SpringJPA之save方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

JavaScript设计模式手写示例讲解

这篇文章主要介绍了JavaScript设计模式手写示例,设计模式(Designpattern)是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、可维护性、灵活性好
2022-12-19

SpringJPA学习之delete方法示例详解

这篇文章主要为大家介绍了SpringJPA学习delete方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

Spring JPA之find拓展方法示例详解

这篇文章主要为大家介绍了Spring JPA之find拓展方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

Object.defineproperty方法示例详解

Object.defineproperty 的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性,这篇文章主要介绍了Object.defineproperty方法,需要的朋友可以参考下
2022-12-22

android教程之service使用方法示例详解

Service的生命周期 (适用于2.1及以上) 1. 被startService的无论是否有任何活动绑定到该Service,都在后台运行。onCreate(若需要) -> onStart(int id, Bundle args). 多次
2022-06-06

Java.lang.Long.parseLong()方法详解及示例

这个java.lang.Long.parseLong(Strings)方法解析字符串参数s作为有符号十进制长,下面这篇文章主要给大家介绍了关于Java.lang.Long.parseLong()方法详解及示例的相关资料,需要的朋友可以参考下
2023-01-31

编程热搜

目录