# 手写一个instanceOf
# 两种实现方式
const myInstanceof = (target, origin) => {
while (target) {
if (target.__proto__ === origin.prototype) {
return true
}
target = target.__proto__
}
return false
}
// 来源:阿冲
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
function myInstanceof(left, right) {
//基本数据类型直接返回false
if(typeof left !== 'object' || left === null) return false;
//getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象
let proto = Object.getPrototypeOf(left);
while(true) {
//查找到尽头,还没找到
if(proto == null) return false;
//找到相同的原型对象
if(proto == right.prototype) return true;
proto = Object.getPrototypeOf(proto);
}
}
// 来源:掘金-神三元
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 总结下
function myInstanceof(target, origin) {
// 非object直接返回false
if(typeof target !== 'object' || target === null) return false;
let proto = Object.getPrototypeOf(target);
while (proto) {
if (proto === origin.prototype) {
return true
}
proto = Object.getPrototypeOf(proto);
}
return false
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 原始值的instanceof
class PrimitiveString {
static [Symbol.hasInstance](x) {
return typeof x === 'string'
}
}
1
2
3
4
5
2
3
4
5
const primitive = trye => {
return class {
static [Symbol.hasInstance](value) {
return typeof value === trye
}
}
}
const primitiveString = primitive('string')
const primitiveNumber = primitive('number')
console.log('123' instanceof primitiveString)
console.log(123 instanceof primitiveNumber)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 致谢
感谢大家阅读我的文章,如果对我感兴趣可以点击页面右上角,帮我点个star。
作者:前端小然子
链接: https://xiaoranzife.com/guide/jichu/%E6%89%8B%E5%86%99instanceOf.html
来源:前端小然子的博客
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。