instanceof 功能
a instanceof b
官方解釋爲檢查構造函數b的prototype
有沒有出現在a的原型鏈上。比如:
function A() {
}
function B() { }
function C() { }
//B繼承A
B.prototype = new A()
let instance = new B()
console.log('---instance instanceof B-----', instance instanceof B) //true
console.log('---instance instanceof A-----', instance instanceof A) //true
手動實現
既然知道了instanceof的原理,就可以寫一個函數來實現這個功能。實現過程中會用到以下兩個函數中的一個。
getPrototypeOf
:獲取某個實例對象的原型;
isPrototypeOf
:檢測某一個對象是否存在於另一個對象的原型鏈上;
基於getPrototypeOf
實現的函數爲:
function isInstanceOf(target1, target2) {
let proto = Object.getPrototypeOf(target1)
if(!proto){return false}
if (proto === target2.prototype) { return true }
//遞歸去原型鏈上找
return isInstanceOf(proto, target2)
}
基於isPrototypeOf
實現的函數爲:
function isInstanceOf(target1, target2) {
return target2.prototypeis.isPrototypeOf(target1)
}