JavaScript 手动实现instanceof的方法

1. 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

如上代码,定义了两个构造函数,PersonPerson2,又实用new操作创建了一个Person的实例对象usr

实用instanceof操作符,分别检验构造函数prototype属性是否在usr这个实例的原型链上。

当然,结果显示,PersonObjectprototype属性在usr的原型链上。usr不是Person2的实例,故Person2prototype属性不在usr的原型链上。

2. 实现instanceof

明白了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

implicitPrototypenull时,结束寻找,没有找到,返回false

原型链其实就是一个类似链表的数据结构。

instanceof做的事,就是在链表上寻找有没有目标节点。从表头节点开始,不断向后遍历,若找到目标节点,返回true。遍历结束还没找到,返回false

3. 验证

写一个简单的实例验证一下自己实现的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节点本身。

JavaScript常见手写代码:

「GitHub—code-js」

到此这篇关于JavaScript 手动实现instanceof的文章就介绍到这了,更多相关JavaScript instanceof内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript中instanceof运算符的用法总结

    JavaScript中instanceof运算符是返回一个 Boolean 值,指出对象是否是特定类的一个实例. 使用方法:result = object instanceof class其中result是必选项.任意变量.object是必选项.任意对象表达式.class是必选项.任意已定义的对象类. 说明如果 object 是 class 的一个实例,则 instanceof 运算符返回 true.如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false.

  • 理解Javascript_07_理解instanceof实现原理

    那么instanceof的这种行为到底是如何实现的呢,现在让我们揭开instanceof背后的迷雾. instanceof原理 照惯例,我们先来看一段代码: 复制代码 代码如下: function Cat(){} Cat.prototype = {} function Dog(){} Dog.prototype ={} var dog1 = new Dog(); alert(dog1 instanceof Dog);//true alert(dog1 instanceof Object);//t

  • 详解JavaScript中typeof与instanceof用法

    今天写JS代码,遇到动态生成多个名称相同的input复选按钮 需要判断其是否是数组,用到了if (typeof(document.MapCheckMgr.checkid)!="undefined") 以前用得少,就顺便查了一下关于typeof的那些事 typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number,boolean,string,function(函数),object(NULL,数组,对象),undefined. 如: alert(ty

  • JavaScript中instanceof运算符的使用示例

    instanceof运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上. 实例一:普遍用法 A instanceof B :检测B.prototype是否存在于参数A的原型链上. function Ben() { } var ben = new Ben(); console.log(ben instanceof Ben);//true 实例二:继承中判断实例是否属于它的父类 function Ben_parent() {} function Ben_son

  • JavaScript类型检测之typeof 和 instanceof 的缺陷与优化

    在javascript中,typeof 和 instanceof 是用来判断数据类型比较通用的两个方法,这篇文章的目的是通过对这两个方法介绍来分析其存在的不足并提出优化方案. typeof -------------------------------------------------------------------------------- typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number.boolean.string.o

  • JS中typeof与instanceof之间的区别总结

    JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: typeof typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类型.typeof 一般只能返回如下几个结果: number,boolean,string,function,object,undefined.我们可以使用 typeof 来获取一个变量是否存在,如 if(typeof a!="un

  • 实例讲解JavaScript中instanceof运算符的用法

    instanceof 运算符简介 在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object".ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题.instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型.与 typeof 方法不同的是,instanceof 方法要求开发者明确地确

  • JavaScript 手动实现instanceof的方法

    1. 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 instanceo

  • Django imgareaselect手动剪切头像实现方法

    本文实例讲述了Django imgareaselect手动剪切头像的方法.分享给大家供大家参考.具体如下: index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>上传图片</title> </head> <body> <form action="." method="

  • JavaScript模拟实现继承的方法

    本文实例讲述了JavaScript模拟实现继承的方法.分享给大家供大家参考.具体分析如下: 我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承.我们也只能通过在原对象里添加或改写属性来模拟实现. 先定义一个父类, //父类 function ParentClass() { this.className = "ParentClass"; this.auth = "Auth"; this.

  • javascript的几种继承方法介绍

    1.原型链继承:构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.确认原型和实例之间的关系用instanceof. 原型链继承缺点:字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数 function Parent(){ this.name='mike'; } function Child(){ this.age=12; } //儿子继承父亲(原型链) Child.prototype

  • JavaScript面向对象中接口实现方法详解

    本文实例讲述了JavaScript面向对象中接口实现方法.分享给大家供大家参考,具体如下: 接口是面向对象编程的基础,它是一组包含了函数型方法的数据结构,与类一样,都是编程语言中比较抽象的概念.比如生活中的接口,机顶盒,人们利用它来实现收看不同频道和信号的节目,它犹如对不同类型的信息进行集合和封装的设备,最后把各种不同类型的信息转换为电视能够识别的信息.在编程语言中的接口,实际上是不同类的封装并提供统一的外部联系通道,这样其他对象就可以利用接口来调用不同类的成员了. --整理自<jQuery开发

  • javascript中的数据类型检测方法详解

    本文实例讲述了javascript中的数据类型检测方法.分享给大家供大家参考,具体如下: 在javascript中数据类型 值类型: 布尔(Boolean),数值(Number),字符(String),空(Null),未定义(Undefined) 引用类型: 对象(Object),函数(Function),数组(Array),日期(Date),正则(RegExp)等等. 检测方式之 typeof console.log(typeof undefined)//'undefined' console

  • javascript实现图片轮换动作方法

    图片轮换是一种相当复杂的技术,早些年基本用flash实现.这里有一个链接,教大家如何用flash实现它的.之所以用flash,是因为flash是基于帧的,这与图片轮换的原理相当接近.为了模拟帧的效果,我们要用到overflow把多余的部分遮罩掉,也就是flash中常说的遮罩层.在Flash中,连时间轴都是可视的,而我们则全凭想象力与数学来计算现在是到了哪一张图.加之,flash有Robert Penner大神的缓动公式,那实在太耀眼,直到script.aculo.us类库搞出自己的缓动公式,才扭

  • JavaScript 中的六种循环方法

    Javascript中的遍历循环 1.for循环 对于数值索引的数组来说,可以使用标准的for循环来遍历值 const arr=[1,2,3,4]; for(let i=0;i<arr.length;i++){ console.log(i); } 2.for...in循环 for...in循环可以用来遍历对象的可枚举属性列表(包括原型链上的属性) const myObject={}; Object.defineProperty(myobject,"a",{ //可枚举 enume

  • AngularJS使用angular.bootstrap完成模块手动加载的方法分析

    本文实例分析了AngularJS使用angular.bootstrap完成模块手动加载的方法.分享给大家供大家参考,具体如下: 之前我们看到使用ng-app指令,可以实现模块的自动加载.现在我们看下,angular中如何手动加载模块.需要使用到angular.bootstrap这个函数. <html> <head> <script src="angular.js"></script> <script> // 创建moudle1

  • php与javascript正则匹配中文的方法分析

    本文实例讲述了php与javascript正则匹配中文的方法.分享给大家供大家参考,具体如下: php中正则匹配utf-8中文: (重点是:[\x{4e00}-\x{9fa5}]+) $str = "我们"; if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str,$arr)) { print("该字符串全部是中文"); echo '<pre>'; print_r($arr); } else {

随机推荐