最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解Javascript_07_理解instanceof實現(xiàn)原理

 更新時間:2010年10月15日 23:49:36   作者:  
在《Javascript類型檢測》一文中講到了用instanceof來用做檢測類型,讓我們來回顧一下

那么instanceof的這種行為到底是如何實現(xiàn)的呢,現(xiàn)在讓我們揭開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

讓我們畫一張內存圖來分析一下:

內存圖比較復雜,解釋一下:
程序本身是一個動態(tài)的概念,隨著程序的執(zhí)行,Dog.prototype會不斷的改變。但是為了方便,我只畫了一張圖來表達這三次prototype引用的改變。在堆中,右邊是函數(shù)對象的內存表示,中間的是函數(shù)對象的prototype屬性的指向,左邊的是函數(shù)對象創(chuàng)建的對象實例。其中函數(shù)對象指向prototype屬性的指針上寫了dog1,dog2,dog3分別對應Dog.prototype的三次引用改變。它們和棧中的dog1,dog2,dog3也有對應的關系。(注:關于函數(shù)對象將在后續(xù)博文中講解)
來有一點要注意,就是dog3中函數(shù)對象的prototype屬性為null,則函數(shù)對象實例dog3的內部[[prototype]]屬性將指向Object.prototype,這一點在《理解Javascript_06_理解對象的創(chuàng)建過程》已經講解過了。

結論
根據(jù)代碼運行結果和內存結構,推導出結論:
instanceof 檢測一個對象A是不是另一個對象B的實例的原理是:查看對象B的prototype指向的對象是否在對象A的[[prototype]]鏈上。如果在,則返回true,如果不在則返回false。不過有一個特殊的情況,當對象B的prototype為null將會報錯(類似于空指針異常)。

這里推薦一篇文章,來自于歲月如歌,也是關于instanceof原理的,角度不同,但有異曲同工之妙。

相關文章

  • JavaScript實現(xiàn)班級抽簽小程序

    JavaScript實現(xiàn)班級抽簽小程序

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)班級抽簽小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 圖片onload事件觸發(fā)問題解決方法

    圖片onload事件觸發(fā)問題解決方法

    當頁面上存在一個圖片元素時如:<img src='xxxx' alt="" />,頁面加載中ie7、8跟chrome下圖片的onload事件非常奇怪,有后完全不觸發(fā),有時候觸發(fā)后進行改變某些元素的操作,操作結果無效。
    2011-07-07
  • JS實現(xiàn)HTML標簽轉義及反轉義

    JS實現(xiàn)HTML標簽轉義及反轉義

    本文主要介紹了JS實現(xiàn)HTML標簽轉義及反轉義的方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • uniapp開發(fā)小程序實現(xiàn)滑動頁面控制元素的顯示和隱藏效果

    uniapp開發(fā)小程序實現(xiàn)滑動頁面控制元素的顯示和隱藏效果

    這篇文章主要介紹了uniapp開發(fā)小程序實現(xiàn)滑動頁面控制元素的顯示和隱藏效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Webpack4.x的四個核心概念介紹

    Webpack4.x的四個核心概念介紹

    這篇文章介紹了Webpack4.x的四個核心概念介紹,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 微信小程序swiper使用網絡圖片不顯示問題解決

    微信小程序swiper使用網絡圖片不顯示問題解決

    這篇文章主要介紹了微信小程序swiper使用網絡圖片不顯示問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 解決input輸入框僅支持輸入數(shù)字及兩位小數(shù)點的限制

    解決input輸入框僅支持輸入數(shù)字及兩位小數(shù)點的限制

    這篇文章主要為大家介紹了解決input輸入框僅支持輸入數(shù)字及兩位小數(shù)點的限制技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • js實現(xiàn)拖拽與碰撞檢測

    js實現(xiàn)拖拽與碰撞檢測

    這篇文章主要為大家詳細介紹了js實現(xiàn)拖拽與碰撞檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 使用D3.js制作圖表詳解

    使用D3.js制作圖表詳解

    D3是目前最流行的JavaScript可視化圖表庫之一,D3的圖表類型非常豐富,并且支持SVG格式,因此應用十分廣泛,也有很多圖表插件基于D3開發(fā),比如MetricsGraphics.js,在D3上構建的數(shù)據(jù)圖表非常強大。
    2017-08-08
  • 詳解JavaScript狀態(tài)容器Redux

    詳解JavaScript狀態(tài)容器Redux

    Redux官網上是這樣描述Redux,Redux is a predictable state container for JavaScript apps.(Redux是JavaScript狀態(tài)容器,提供可預測性的狀態(tài)管理)。目前Redux GitHub有5w多star,足以說明 Redux 受歡迎的程度
    2021-06-06

最新評論

凯里市| 莱阳市| 凤庆县| 望谟县| 达日县| 济宁市| 苗栗县| 九江市| 保山市| 庄河市| 客服| 阿图什市| 竹溪县| 高唐县| 嘉荫县| 山阴县| 徐汇区| 云霄县| 郯城县| 宜阳县| 阿巴嘎旗| 大名县| 贵德县| 巍山| 鄂伦春自治旗| 嘉峪关市| 叶城县| 苗栗县| 临清市| 德钦县| 武隆县| 周口市| 东阳市| 石棉县| 淮北市| 翁牛特旗| 兴宁市| 延吉市| 通渭县| 天全县| 赤峰市|