从原型链查找,如果找到则为true。
function _instanceof(left,right){
let left__pro=left.__proto__;
let rightPro=right.prototype;
while(true){
if(left!==null&&right!==null){
if(left__pro===rightPro){
return true
}else{
return false
}
left__pro=left.__proto__
}
}
}
以上只是instanceof的一种实现方式,下面我们就细细来品一下原理。
万物皆有根。树是树他妈生的,猴是猴他妈生的。你怎么知道,树不是猴生的,猴生的不是树呢,答案很简单,他们的基因不同,DNA对比不上。那么instanceof就是一个链条就相当于做DNA对比。
每一个存在于JavaScript环境中的值,除了 null,undefined,都会有一个神奇的“__proto__”属性。
看下面的例子:
let isFn=function(){};
let isObj={a:1};
let isArray=[1];
let isStr='1';
let isNum=1;
let isBoolean=true;
let isSymbol=Symbol();
let isBigInt=BigInt('1');
let isNull=null;
let isUndefined=undefined;
CheckType(isFn);
function CheckType(value){
console.log(value.__proto__)
}
checkPrototype(Function)
checkPrototype(Object)
checkPrototype(Array)
checkPrototype(Number)
checkPrototype(String)
checkPrototype(Boolean)
function checkPrototype(value){
console.log(value.prototype)
}
其实上面写了这么多都是废话,你只要记住左边的__proto__===右边的protototype就好了。