理解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

PHP是一種流行的開源伺服器端腳本語言,大量用於Web開發。它能夠處理動態資料以及控制HTML的輸出,但是,如何實現這一切?那麼,本文將會介紹PHP的核心運作機制和實作原理,並利用具體的程式碼範例,進一步說明其運作過程。 PHP原始碼解讀PHP原始碼是一個由C語言編寫的程序,經過編譯後產生可執行檔php.exe,而對於Web開發中使用的PHP,在執行時一般透過A

instanceof的作用是判斷一個物件是否是某個類別的實例,或者是否實作了某個介面。 instanceof是一個用來檢查物件是否為指定類型的運算子。 instanceof運算子使用場景:1、類型檢查:可以用來判斷一個物件的具體類型,以便根據不同類型執行不同的邏輯;2、介面判斷:可以用來判斷一個物件是否實現了某個接口,以便根據介面的定義呼叫對應的方法;3、向下轉型等等。

PHP中的粒子群演算法實作原理粒子群演算法(ParticleSwarmOptimization,PSO)是一種最佳化演算法,常用於求解複雜的非線性問題。它透過模擬鳥群覓食行為,以尋找最優解。在PHP中,我們可以利用PSO演算法快速求解問題,本文將介紹其實作原理,並給出對應的程式碼範例。粒子群演算法基本原理粒子群演算法的基本原理是透過迭代搜尋找到最優解。演算法中存在一群粒

Kafka訊息佇列的實作原理Kafka是一個分散式發布-訂閱訊息系統,它可以處理大量的數據,並且具有很高的可靠性和可擴展性。 Kafka的實作原理如下:1.主題和分區Kafka中的資料儲存在主題(topic)中,每個主題可以分為多個分區(partition)。分區是Kafka中最小的儲存單位,它是一個有序的、不可變的日誌檔案。生產者將資料寫入主題,而消費者從

刨析swoole非同步任務處理功能的實現原理隨著網路技術的快速發展,各種問題的處理變得越來越複雜。在網路開發中,處理大量的請求和任務是一個常見的挑戰。傳統的同步阻塞方式無法滿足高併發的需求,於是非同步任務處理成為解決方案。 Swoole作為PHP協程網路框架,提供了強大的非同步任務處理功能,本文將以簡單的範例解析其實作原理。在開始之前,我們需要先確保已

理解Tomcat中間件的底層實作原理,需要具體程式碼範例Tomcat是一個開源的、使用廣泛的JavaWeb伺服器和Servlet容器。它具有高度的可擴充性和靈活性,常用於部署和執行JavaWeb應用程式。為了更能理解Tomcat中間件的底層實作原理,我們需要探究它的核心元件和運作機制。本文將透過具體的程式碼範例,解析Tomcat中間件的底層實作原理。 Tom

深入解析Java爬蟲技術:網頁資料抓取的實作原理引言:隨著網路的快速發展和資訊爆炸性成長,大量的資料被儲存在各種網頁上。這些網頁資料對於我們進行資訊擷取、資料分析和業務發展非常重要。而Java爬蟲技術則是一種常用的網頁資料抓取方式。本文將深入解析Java爬蟲技術的實作原理,並提供具體的程式碼範例。一、什麼是爬蟲技術爬蟲技術(WebCrawling)又稱為網
