理解Javascript_07_理解instanceof实现原理_javascript技巧

那么instanceof的这种行为到底是如何实现的呢,现在让我们揭开instanceof背后的迷雾。
instanceof原理
照惯例,我们先来看一段代码:
function Cat(){}
Cat.prototype = {}
function Dog(){}
Dog.prototype ={}
var dog1 = new Dog();
alert(dog1 instanceof Dog);//true
alert(dog1 instanceof Object);//true
Dog.prototype = Cat.prototype;
alert(dog1 instanceof Dog);//false
alert(dog1 instanceof Cat);//false
alert(dog1 instanceof Object);//true;
var dog2= new Dog();
alert(dog2 instanceof Dog);//true
alert(dog2 instanceof Cat);//true
alert(dog2 instanceof Object);//true
Dog.prototype = null;
var dog3 = new Dog();
alert(dog3 instanceof Cat);//false
alert(dog3 instanceof Object);//true
alert(dog3 instanceof Dog);//error
让我们画一张内存图来分析一下:

内存图比较复杂,解释一下:
程序本身是一个动态的概念,随着程序的执行,Dog.prototype会不断的改变。但是为了方便,我只画了一张图来表达这三次prototype引用的改变。在堆中,右边是函数对象的内存表示,中间的是函数对象的prototype属性的指向,左边的是函数对象创建的对象实例。其中函数对象指向prototype属性的指针上写了dog1,dog2,dog3分别对应Dog.prototype的三次引用改变。它们和栈中的dog1,dog2,dog3也有对应的关系。(注:关于函数对象将在后续博文中讲解)
来有一点要注意,就是dog3中函数对象的prototype属性为null,则函数对象实例dog3的内部[[prototype]]属性将指向Object.prototype,这一点在《理解Javascript_06_理解对象的创建过程》已经讲解过了。
结论
根据代码运行结果和内存结构,推导出结论:
instanceof 检测一个对象A是不是另一个对象B的实例的原理是:查看对象B的prototype指向的对象是否在对象A的[[prototype]]链上。如果在,则返回true,如果不在则返回false。不过有一个特殊的情况,当对象B的prototype为null将会报错(类似于空指针异常)。
这里推荐一篇文章,来自于岁月如歌,也是关于instanceof原理的,角度不同,但有异曲同工之妙。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题











Kafka消息队列的底层实现原理概述Kafka是一个分布式、可扩展的消息队列系统,它可以处理大量的数据,并且具有很高的吞吐量和低延迟。Kafka最初是由LinkedIn开发的,现在是Apache软件基金会的一个顶级项目。架构Kafka是一个分布式系统,由多个服务器组成。每个服务器称为一个节点,每个节点都是一个独立的进程。节点之间通过网络连接,形成一个集群。K

instanceof的作用是判断一个对象是否是某个类的实例,或者是否实现了某个接口。instanceof是一个用于检查对象是否是指定类型的运算符。instanceof运算符使用场景:1、类型检查:可以用来判断一个对象的具体类型,以便根据不同类型执行不同的逻辑;2、接口判断:可以用来判断一个对象是否实现了某个接口,以便根据接口的定义调用相应的方法;3、向下转型等等。

PHP是一种流行的开源服务器端脚本语言,大量被用于Web开发。它能够处理动态数据以及控制HTML的输出,但是,如何实现这一切?那么,本文将会介绍PHP的核心运行机制和实现原理,并利用具体的代码示例,进一步说明其运行过程。PHP源码解读PHP源码是一个由C语言编写的程序,经过编译后生成可执行文件php.exe,而对于Web开发中使用的PHP,在执行时一般通过A

PHP中的粒子群算法实现原理粒子群算法(ParticleSwarmOptimization,PSO)是一种优化算法,常用于求解复杂的非线性问题。它通过模拟鸟群觅食行为,以寻找最优解。在PHP中,我们可以利用PSO算法快速求解问题,本文将介绍其实现原理,并给出相应的代码示例。粒子群算法基本原理粒子群算法的基本原理是通过迭代搜索找到最优解。算法中存在一群粒

Kafka消息队列的实现原理Kafka是一个分布式发布-订阅消息系统,它可以处理大量的数据,并且具有很高的可靠性和可扩展性。Kafka的实现原理如下:1.主题和分区Kafka中的数据存储在主题(topic)中,每个主题可以分为多个分区(partition)。分区是Kafka中最小的存储单位,它是一个有序的、不可变的日志文件。生产者将数据写入主题,而消费者从

刨析swoole异步任务处理功能的实现原理随着互联网技术的迅猛发展,各种问题的处理变得越来越复杂。在Web开发中,处理大量的请求和任务是一个常见的挑战。传统的同步阻塞方式无法满足高并发的需求,于是异步任务处理成为一种解决方案。Swoole作为PHP协程网络框架,提供了强大的异步任务处理功能,本文将以一个简单的示例来解析其实现原理。在开始之前,我们需要先确保已

理解Tomcat中间件的底层实现原理,需要具体代码示例Tomcat是一个开源的、使用广泛的JavaWeb服务器和Servlet容器。它具有高度的可扩展性和灵活性,常用于部署和运行JavaWeb应用程序。为了更好地理解Tomcat中间件的底层实现原理,我们需要探究它的核心组件和运行机制。本文将通过具体的代码示例,解析Tomcat中间件的底层实现原理。Tom

深入解析Java爬虫技术:网页数据抓取的实现原理引言:随着互联网的快速发展和信息爆炸式增长,大量的数据被存储在各种网页上。这些网页数据对于我们进行信息提取、数据分析和业务发展非常重要。而Java爬虫技术则是一种常用的网页数据抓取方式。本文将深入解析Java爬虫技术的实现原理,并提供具体的代码示例。一、什么是爬虫技术爬虫技术(WebCrawling)又称为网
