# 题目描述

请你实现一个_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

# 思路

  1. 第一个参数是对象,获取他的__proto__属性,记为curObject
  2. 第二个参数是函数,获取他的prototype,记为curFn
  3. 比较他们是否相等,如果不相等,则继续遍历curObject__proto__,在他的原型链上继续查找,看是否与比较的函数原型对象相同
  4. 相同返回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