instanceof
运算符用于检测构造函数的prototype属性是否存在于实例对象的原型链上。
function C(){}
function D(){}
var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
instanceof
原理就是一层一层查找__proto__,如果和构造函数的prototype相等则返回true,如果一直没有查找成功则返回false
instance.[__proto__...] === instance.constructor.prototype
模拟实现instanceof
function instance_of(L, R) { // L 表示左边表达式 R表示右边表达式
const O = R.prototype; // 取R的显式原型
L = Object.getPrototypeOf(L); // 取L的隐式原型 L = L.__proto__
while(true) {
// Object.prototype.__proto__ === null
if(L===null) {
return false;
}
if(L===O) { // 当L严格等于O时,返回true
return true;
}
L = Object.getPrototypeOf(L); // // 没找到继续向上一层原型链查找 L = L.__proto__
}
}
function Foo(name) {
this.name = name;
}
var f = new Foo('nick')
f instanceof Foo // true
f instanceof Object // true