返回

实现instanceof的原理

前端

javascript中,每个对象都有一个原型对象。原型对象是用于存储对象共有的属性和方法的对象。当一个对象被创建时,它会从原型对象中继承所有属性和方法。对象的原型对象可以通过__proto__属性访问。

原型链是指从一个对象到其原型对象,再到其原型对象的原型对象,依此类推,直到遇到null为止的链。对象的原型链可以帮助javascript查找对象中不存在的属性或方法。当javascript试图访问对象中的一个属性或方法时,它首先会在对象本身中查找。如果在对象本身中找不到,它就会在对象的原型对象中查找。以此类推,直到找到该属性或方法,或者遇到null。

instanceof运算符利用了原型链来判断对象类型。当instanceof运算符被用来判断对象是否属于某个构造函数时,它首先会检查对象的原型对象是否等于构造函数的原型。如果等于,则返回true,否则返回false。

例如,以下代码将返回true:

function Person(name) {
  this.name = name;
}

const person = new Person('John Doe');

console.log(person instanceof Person); // true

这是因为person对象的原型对象等于Person.prototype,而Person.prototype又等于Function.prototype,而Function.prototype最终等于Object.prototype。因此,person对象的原型链上存在Person.prototype,所以instanceof运算符返回true。

function 实现instanceof(obj, constructor) {
  while (obj) {
    if (obj === constructor.prototype) {
      return true;
    }
    obj = obj.__proto__;
  }
  return false;
}

我们可以使用这个函数来判断对象是否属于某个构造函数。例如,以下代码将返回true:

function Person(name) {
  this.name = name;
}

const person = new Person('John Doe');

console.log(实现instanceof(person, Person)); // true

instanceof运算符是一个非常有用的工具,可以帮助javascript开发人员判断对象类型。它经常被用于类型检查和错误处理。