instanceof的原理
new String() instanceof String;
instanceof
是判断某个对象(例如:new String()
)的原型链(__proto__
)上面是否存在指定对象(例如:String
)的原型(prototype
);
实现
function instanceOf(target, func) {
const pto = target.__proto__;
const pty = func.prototype;
if (pto === pty) {
return true
} else {
instanceOf(pto, func)
}
}
下面我们来试用一下
const Func = (function () {
function func() {
this.a = 1
}
return func
})
new Func() instanceof Func; //true
instanceOf(new Func(), Func); //true
'123' instanceof String; //false
instanceOf('123', String); //true
我们发现'123'
那个是错的,那是因为instanceof
只能判断实例对象也就是引用类型是否在构造函数的原型上面,而不能判判断基础类型
我们再加多一层基础类型的判断
function instanceOf(target, func) {
if (typeof target !== 'object' || typeof target !== 'function') {
return false
}
const pto = target.__proto__;
const pty = func.prototype;
if (pto === pty) {
return true
} else {
instanceOf(pto, func)
}
}
'123' instanceof String; //false
instanceOf('123', String); //false