A instanceof B的作用就是判断A是否在B的原型链上,所以instanceof 原理就是一层一层查找 proto,如果和 constructor.prototype 相等则返回 true,如果一直没有查找成功则返回 false。
function B() {}
function C() {}
function instance(A, B) {
// 获取A的原型
A = A.__proto__;
// 获取B的原型
B = B.prototype;
let isStop = false;
while (!isStop) {
// 当到达A的原型链的顶端,即null的时候都没有找到,则A不在B的原型链,返回false。
if (A == null) {
isStop = true;
return false;
}
// A的原型链上的某个原型等于B 即A在B的原型链上,返回true。
if (A === B) {
isStop = true;
return true;
}
// 继续在A的原型链上查找
A = A.__prop__;
}
}
let a = {};
let b = new B();
let c = new C();
console.log(instance(a, B)); // false
console.log(instance(b, B)); // true
console.log(instance(c, B)); // false