instanceof原理
instanceof
作用:用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
详细来说就是,instanceof运算符是检查一个实例对象的原型链上是否出现了构造函数的原型对象,
如果实例对象的原型链中出现了构造函数的原型对象,那么这个实例对象就是构造函数的一个实例,
返回true,否则,返回false
缺点
由于instanceof基于原型链的检查,因此如果某个对象的原型链比较深,检查的效率会比较低
手写instanceof
function myInstanceof(target, constructor) {
if(typeof target !== 'object' || target == null || typeof constructor != 'function'){
return false;
}
// 获取对象的原型对象
let proto = Object.getPrototypeOf(target);
// 沿着原型链查找
while (proto) {
if (proto === constructor.prototype) {
return true;
}
// 获取原型链上的下个原型
proto = Object.getPrototypeOf(proto);
}
return false;
}
注意事项
instanceof只能检查对象是否是某个构造函数的实例,不能用于基本类型的检查。
如果检查的对象是一个基本数据类型,则返回false。
instanceof判断的是对象的原型链,因此如果有一个对象是某个类的实例,那么它一定是这个类原型链上的某个实例。
因此,如果有一个对象的原型链上没有该类的原型对象,那么它就不是该类的实例,即使有与该类相同的属性和方法。