Skip to content

模拟实现instanceof并谈其原理 #5

@impeiran

Description

@impeiran

instanceof用来判断左侧变量是否为右边变量的实例,而创造一个实例的new关键字,其实就是根据构造函数的原型属性prototype创造新的对象,并以其为上下文执行构造函数。

因此,对于实现instanceof,我们可以获取左侧变量的构造函数的原型对象,跟右侧变量的原型对象进行比较。

但这样只是获取原型链上目标对象的直接父级,还需要逐层递归往原型链上面进行查找。

JS的对象里就有一个属性__proto__,指向的就是当前对象的构造函数的原型,我们可以基于此实现instanceof

/**
 * mock instanceof
 * @param {Any} left 
 * @param {Any} right 
 */
const _instanceof = (left, right) => {
  if (!left || !right) return new Error('lack of parameter')

  let proto = left.__proto__

  right = right.prototype || {}

  while (proto) {
    if (proto === right) {
      return true
    } else {
      proto = proto.__proto__
    }
  }

  return false
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions