instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。
大白話就是判斷某個(gè)實(shí)例是否屬于某個(gè)類型或者屬于它的父類如失、祖先類...
function Parent () {
this.nums = 100
}
function Child (chi) {
this.chi = chi
}
Child.prototype = new Parent() // 原型鏈繼承
const ming = new Child('tennis')
ming instanceof Child // true
ming instanceof Parent // true
Child
通過原型鏈繼承的方式繼承了Parent
,所以ming
不僅屬于Child
類型也屬于Parent
類型叔磷。知道了instanceof的用法须床,那下面就來實(shí)現(xiàn)一下。
我們要判斷A
是不是屬于B
這個(gè)類型噪叙,只需要當(dāng)A
的原型鏈上存在B即可矮锈,即A
順著__proto__
向上查找,一旦能訪問到B
的原型對(duì)象B.prototype
睁蕾,表明A
屬于B
類型苞笨,否則的話A
順著__proto__
最終會(huì)指向null。
while循環(huán),此時(shí)此刻猫缭,非你莫屬葱弟。
function new_instanceof(left, right) {
let _left = left.__proto__
while (_left !== null) {
if (_left === right.prototype) {
return true
}
_left = _left.__proto__
}
return false
}
這就是instanceof的主要原理,嗯猜丹,只有這幾行芝加,超級(jí)簡(jiǎn)單,還能串聯(lián)一波原型射窒、原型鏈藏杖,它不香嗎...