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

JavaScript之instanceof方法手寫示例詳解

 更新時間:2022年10月31日 10:03:28   作者:十七喜歡前端  
這篇文章主要為大家介紹了JavaScript之instanceof方法手寫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

方法介紹

instanceof 是什么?

用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個實例對象的原型鏈上

語法:object instanceof constructor
object:某個實例對象
constructor:某個構(gòu)造函數(shù)

簡言之就是用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型鏈上。

個人理解:

instanceof 是用來判斷左側(cè)對象是否是右側(cè)構(gòu)造函數(shù)的實例化對象,或則說左側(cè)對象能否通過其隱式原型 **[[proto]]**在原型鏈上一層層向上查找到右側(cè)函數(shù)的原型對象,即函數(shù)原型對象出現(xiàn)在實例對象的原型鏈上就返回 true。

通俗的理解: 右側(cè)是不是左側(cè)的爸爸、爺爺、祖宗,只要左側(cè)對象繼承自右側(cè)函數(shù)就為 true

instanceof 使用方式

object instanceof 構(gòu)造函數(shù), 它有兩個必傳參數(shù),左側(cè)必須為對象類型,右側(cè)必須為函數(shù)類型。返回值為 Boolean 類型

注意: 你可能會認為js中萬物皆對象,這個錯誤的理解可能會誤導大家出現(xiàn)這種寫法: 'str' instanceof String,返回值為false,因為 ‘str’ 就是簡單的字符串,它和通過String構(gòu)造函數(shù)(new String('str'))創(chuàng)造出來的字符串是有區(qū)別的,可自行在控制臺打印出來看,其值會封裝成String對象類型的字符串,同理 new Number(3) instanceof Number, new Boolean(true) instanceof Boolean ……等等返回值為true。

代碼示例:

// 定義構(gòu)造函數(shù)
function C () {}
function D () {}
// 實例化一個 o 對象
var o = new C()
// true,true --> C.prototype 在 o 的原型鏈上
console.log(o instanceof C, o.__proto__ === C.prototype, '此時 o 的 __proto__:', 
o.__proto__, '此時 C 的 prototype:', C.prototype)
// false,false --> D.prototype 不在 o 的原型鏈上
console.log(o instanceof D, o.__proto__ === D.prototype)
// true true --> Object.prototype 在 o 的原型鏈上
console.log(o instanceof Object, o.__proto__.__proto__ === Object.prototype)
// 這時我們修改構(gòu)造函數(shù) C 的原型為一個空對象
C.prototype = {}
// 實例化一個 o2 對象
var o2 = new C()
// true --> C.prototype 在 o2 的原型鏈上
console.log(o2 instanceof C)
// false,C.prototype 指向了一個空對象,這個空對象不在 o 的原型鏈上.
console.log(o instanceof C, '此時 o 的 __proto__:', o.__proto__, '此時 C 的 prototype:', C.prototype)
console.log('此時 D 的 prototype:', D.prototype);
// 繼承
D.prototype = new C()
console.log('此時 D 的 prototype:', D.prototype);
var o3 = new D()
// true, true --> 因為 o3 是 構(gòu)造函數(shù) D new 出來的實例對象,所以 D.prototype 一定在 o3 的原型鏈上
console.log(o3 instanceof D, o3.__proto__ === D.prototype)
// true --> 因為 C.prototype 現(xiàn)在在 o3 的原型鏈上
console.log(o3 instanceof C)
// true,true --> 上面的結(jié)果為什么為 true 呢,看如下代碼,D.prototype 是 構(gòu)造函數(shù) C new 出來的實例對象,所以 C.prototype 一定在 D.prototype 的原型鏈上
console.log(o3.__proto__ === D.prototype, D.prototype.__proto__ === C.prototype);
// true 相當于如下代碼
console.log(o3.__proto__.__proto__ === C.prototype);

開始手寫

由上我們可以知道,instanceof其判斷的原理是:通過左側(cè)對象的隱式原型屬性 __ proto __ 在原型鏈上向上一層層查找,找到右側(cè)構(gòu)造函數(shù)的原型對象屬性 prototype 就返回 true。明白這一點也就很容易寫出自己的 instanceof。

注:需要借助循環(huán)來實現(xiàn)。

function myInstanceof(obj, func) {
    if(!['function', 'object'].includes(typeof obj) || obj === null) {
    	// 基本數(shù)據(jù)類型直接返回false,因為不滿足instanceof的左側(cè)參數(shù)是對象或者說引用類型
        return false
    }
    let objProto = obj.__proto__, funcProto = func.prototype
    while(objProto !== funcProto) {
    	// obj.__proto__不等于func.prototype時,繼續(xù)通過__proto__向上層查找
    	// 當找到原型鏈盡頭Object.prototype.__proto__=null 時還未找到,就返回false
        objProto = objProto.__proto__
        if(objProto === null){
            return false
        }
    }
    // obj.__proto__ 等于 prototype = func.prototype 時,不會進入上面循環(huán),返回true
    // 不等進入上面循環(huán),找到相等時會跳出循環(huán),走到這里返回true
    return true
}
//測試
function A(){}
let a=new A;
console.log(myInstanceof(a,A))//true
console.log(myInstanceof([],A))//false

以上就是JavaScript之instanceof方法手寫示例詳解的詳細內(nèi)容,更多關(guān)于JavaScript instanceof 方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS+HTML5本地存儲Localstorage實現(xiàn)注冊登錄及驗證功能示例

    JS+HTML5本地存儲Localstorage實現(xiàn)注冊登錄及驗證功能示例

    這篇文章主要介紹了JS+HTML5本地存儲Localstorage實現(xiàn)注冊登錄及驗證功能,結(jié)合實例形式分析了基于JS+HTML5本地存儲Localstorage實現(xiàn)注冊登錄及驗證相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • Svelte?和?React的比較詳解(一)

    Svelte?和?React的比較詳解(一)

    在這篇文章中,我將Svelte?還是?React作了對比,不能以個人意見代表誰好誰壞。以及我發(fā)現(xiàn)使用這兩個框架的一些區(qū)別,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • JavaScript 實現(xiàn)同時選取多個時間段的方法

    JavaScript 實現(xiàn)同時選取多個時間段的方法

    這篇文章主要介紹了JavaScript 實現(xiàn)同時選取多個時間段的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 基于JavaScript實現(xiàn)表單密碼的隱藏和顯示出來

    基于JavaScript實現(xiàn)表單密碼的隱藏和顯示出來

    為了網(wǎng)站的安全性,很多朋友都把密碼設的比較復雜,但是如何密碼不能明顯示,不知道輸?shù)氖菍κ清e,為了安全起見可以把密碼顯示的,那么基于js代碼如何實現(xiàn)的呢?下面通過本文給大家介紹JavaScript實現(xiàn)表單密碼的隱藏和顯示,需要的朋友參考下
    2016-03-03
  • H5 js點擊按鈕復制文本到粘貼板

    H5 js點擊按鈕復制文本到粘貼板

    這篇文章主要為大家詳細介紹了H5 js點擊按鈕復制文本到粘貼板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • javascript replace方法與正則表達式

    javascript replace方法與正則表達式

    replace方法的語法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正則表達式對象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串。。為了幫助大家更好的理解,下面舉個簡單例子說明一下
    2008-02-02
  • JavaScript三種書寫位置之內(nèi)聯(lián)、內(nèi)部與外部詳解

    JavaScript三種書寫位置之內(nèi)聯(lián)、內(nèi)部與外部詳解

    JavaScript是一種廣泛使用的編程語言,它不僅可以在瀏覽器環(huán)境中運行,也可以在服務器端通過Node.js運行,這篇文章主要介紹了JavaScript三種書寫位置之內(nèi)聯(lián)、內(nèi)部與外部的相關(guān)資料,需要的朋友可以參考下
    2025-08-08
  • 小程序獲取用戶名和頭像完整代碼

    小程序獲取用戶名和頭像完整代碼

    這篇文章主要介紹了關(guān)于小程序獲取用戶名和頭像的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學習或者用小程序具有一需要的參考借鑒價值,朋友可以參考下
    2023-07-07
  • JS onmousemove鼠標移動坐標接龍DIV效果實例

    JS onmousemove鼠標移動坐標接龍DIV效果實例

    這篇文章主要介紹了JS onmousemove鼠標移動坐標接龍DIV效果實例,有需要的朋友可以參考一下
    2013-12-12
  • 基于ES6作用域和解構(gòu)賦值詳解

    基于ES6作用域和解構(gòu)賦值詳解

    下面小編就為大家?guī)硪黄贓S6作用域和解構(gòu)賦值詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

永宁县| 泸溪县| 洞口县| 共和县| 成武县| 涞源县| 济源市| 香格里拉县| 云南省| 香港 | 永仁县| 织金县| 广灵县| 穆棱市| 永新县| 齐河县| 会泽县| 剑阁县| 炎陵县| 从化市| 宝兴县| 永胜县| 英吉沙县| 阳曲县| 长治县| 祁连县| 化州市| 乐平市| 三江| 常山县| 泊头市| 瑞丽市| 靖江市| 永吉县| 石屏县| 通许县| 景泰县| 从江县| 东城区| 蚌埠市| 崇左市|