作用:某对象 是否为 某构造函数(类) 的实例。换言之,可以判断对象的类型。
知识储备
- 每个函数都有prototype 属性,指向原型。
- 每个对象都有__proto__属性,指向创建该对象的构造的原型。其实它指向的是[[prototype]],但是[[prototype]]是内部属性,我们访问不到,所以使用__proto__来访问。
- 寻的是地址是作比较,是否执行同一片内存地址
实现步骤
1. 先取得当前构造函数(类)的原型 以及当前实例对象的原型链(proto = proto.__proto__)
2. 一直递归查找,执行原型链的查找机制
3. 如果对象的原型链 上面找到了 当前构造函数 的原型,则返回 true
4. 如果一直向上找到了对象的基类null 都未能寻到,则返回false -> 即当: Object.__proto__.__proto__ == null
代码实现
function _instanceOf(obj,classFunc){
let proto = obj.__proto__
while(1){
if(proto === null){
return false;
}
if(proto === classFunc.prototype){
return true
}
proto = proto.__proto__
}
}
测试代码
let str = new String('1')
_instanceOf(str,String)// true