国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

理解Javascript_07_理解instanceof實現原理

2019-11-21 00:12:11
字體:
來源:轉載
供稿:網友

那么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原理的,角度不同,但有異曲同工之妙。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 明光市| 涞水县| 彩票| 罗山县| 永春县| 福贡县| 淮安市| 崇礼县| 灵山县| 萨嘎县| 卢氏县| 中西区| 东乡族自治县| 铜川市| 宜川县| 绥中县| 南召县| 瑞昌市| 贺州市| 赫章县| 梁平县| 南木林县| 海盐县| 温宿县| 万载县| 商洛市| 星子县| 鄯善县| 宣武区| 丹江口市| 兰溪市| 平阳县| 无为县| 广州市| 兴安盟| 林甸县| 屏山县| 卓资县| 江安县| 梧州市| 三江|