定義
B instanceof A:
A構(gòu)造函數(shù)的prototype對(duì)象是否在B的原型鏈上
A.isPrototypeOf(B):
A對(duì)象是否在B的原型鏈上
定義上的區(qū)別比較難以理解仇冯,先從一個(gè)例子開(kāi)始色难。
實(shí)例
class A{}
class B extends A{}
let b = new B();
一個(gè)很簡(jiǎn)單的繼承,首先弄清楚這兩個(gè)類(lèi)之間的關(guān)系
B.__proto__ === A //true
B.prototype.__proto__==A.prototype //true
b.__proto__ === B.prototype //true
為什么是這樣呢
首先類(lèi)的繼承是按下面方式實(shí)現(xiàn)的
class A {
}
class B {
}
// B的實(shí)例繼承A的實(shí)例
Object.setPrototypeOf(B.prototype, A.prototype);
const b = new B();
// B的實(shí)例繼承A的靜態(tài)屬性
Object.setPrototypeOf(B, A);
const b = new B();
我們知道setPrototypeOf方法是
Object.setPrototypeOf = function (obj, proto) {
obj.__proto__ = proto;
return obj;
}
所以得出前兩個(gè)表達(dá)式
而new操作是按如下方式實(shí)現(xiàn)的
var b = new Object();
b.__proto__ = B.prototype;
B.call(b);
所有得到第三個(gè)表達(dá)式
接下來(lái)看看instanceof和isPrototypeOf
A.isPrototypeOf(B);//true
A.isPrototypeOf(b);//false
b instanceof B;//true
b instanceof A;//true
B instanceof A;//false
再把剛才的關(guān)系提一遍
B.__proto__ === A //true
B.prototype.__proto__=A.prototype //true
b.__proto__ === B.prototype //true
回頭看定義就清晰很多了
A對(duì)象在B的原型鏈上,不在b的原型鏈上,所以
A.isPrototypeOf(B);//true
A.isPrototypeOf(b);//false
A氧急,B的prototype在b的原型鏈上而不在B的原型鏈上,所以
b instanceof B;//true
b instanceof A;//true
B instanceof A;//false
總結(jié)
也就是說(shuō)Y instanceof X判斷是的是X的prototype是否在Y的原型鏈上,而我們知道實(shí)例的原型鏈(proto)指向的就是其構(gòu)造函數(shù)的prototype,即Y instanceof X判斷Y是否是X的一個(gè)實(shí)例(若Y是X的實(shí)例弧呐,那他也是X的父類(lèi)的實(shí)例)
而X.isPrototypeOf(Y)判斷的是X對(duì)象是否在Y的原型鏈上,同樣Y繼承X的關(guān)系是X對(duì)象在Y對(duì)象的原型鏈上,即X.isPrototypeOf(Y)判斷X是否繼承至Y窿锉。