【模拟实现】instanceof

3/26/2021 面试模拟实现原型链

# 原理

MDN定义 - instanceof (opens new window)

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型上。

特别注意:对值类型变量使用 instanceof (opens new window)

# 实现思路

遍历左边变量的原型链,直到找到右边变量的 prototype,如果没有找到,返回 false

# 代码实现(函数形式)

/**
 * instanceof 函数
 * @param {Object} left 某变量
 * @param {Function} right 某构造函数
 */
function myInstanceofFn (left, right) {
  // 值类型变量
  if (left == null) return false
  if (['boolean', 'string', 'number'].indexOf(typeof left) > -1) return false

  let lProto = left.__proto__
  const target = right.prototype
  while (lProto) {
    if (lProto === target) return true
    lProto = lProto.__proto__
  }
  return false
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 测试一下

分别测试构造函数不同返回值情况

// 测试值类型
console.log(  // false
  myInstanceofFn(Object.create(null), Object),
  Object.create(null) instanceof Object
)
console.log(  // false
  myInstanceofFn('abc', Object),
  'abc' instanceof Object
)

// 测试引用类型
console.log(  // true
  myInstanceofFn(Array, Object),
  Array instanceof Object
)
console.log(  // true
  myInstanceofFn(Function, Object),
  Function instanceof Object
)
console.log(  // true
  myInstanceofFn(new String('abc'), String),
  new String('abc') instanceof String
)
console.log(  // true
  myInstanceofFn(new String('abc'), Object),
  new String('abc') instanceof Object
)
console.log(  // false
  myInstanceofFn(new String('abc'), Array),
  new String('abc') instanceof Array
)
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
30
31
Last Updated: 3/31/2021, 1:05:35 PM