# 题目描述
请你实现一个_instance
,以Boolean
的形式返回第一个实例参数是否在第二个函数参数的原型链上
# 测试
function test() {
const Fn = function () {};
const o = new Fn();
const result = _instanceof(o, Fn) && !_instanceof(o, Array);
return result;
}
// 输出: true
1
2
3
4
5
6
7
2
3
4
5
6
7
# 思路
- 第一个参数是对象,获取他的
__proto__
属性,记为curObject
- 第二个参数是函数,获取他的
prototype
,记为curFn
- 比较他们是否相等,如果不相等,则继续遍历
curObject
的__proto__
,在他的原型链上继续查找,看是否与比较的函数原型对象相同 - 相同返回true,否则遍历到终点还不相同,即为
Object.prototype.__proto__
为null
,返回false
# 代码实现
function test() {
const Fn = function () {};
const o = new Fn();
const result = _instanceof(o, Fn) && !_instanceof(o, Array);
return result;
}
const _instanceof = (target, Fn) => {
let curObject = target.__proto__;
let curFn = Fn.prototype;
while(1){
if(curObject == curFn){
return true;
}
// 判断尽头 —— 因为Object.prototype.__proto__ = null
if(curObject === null){
return false;
}
// 继续比较原型对象上的__proto__属性
// 原型链
curObject = curObject.__proto__;
}
}
const res = test();
console.log("结果为: ", res);
// 结果为: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29