概念: instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置
详细来说:instanceof 运算符的原理是通过检查object的原型链是否包含constructor的原型对象。如果object的原型链中存在constructor的原型对象,那么object就是constructor的一个实例,返回值为true。如果object的原型链中不存在constructor的原型对象,那么object就不是constructor的实例,返回值为flase
缺点:由于 instanceof 是基于原型链的检查,因此如果某个对象的原型链比较深,那么检查的效率比较低
具体手写实现:
function myInstanceof(left, right) {
// 获取对象的原型
let proto = Object.getPrototypeOf(left)
// 获取构造函数的 prototype 对象
let prototype = right.prototype;
// 判断构造函数的 prototype 对象是否在对象的原型链上
while (true) {
if (!proto) return false;
if (proto === prototype) return true;
// 如果没有找到,就继续从其原型上找,Object.getPrototypeOf方法用来获取指定对象的原型
proto = Object.getPrototypeOf(proto);
}
}