手写instanceof

89 阅读1分钟

手写instanceof

instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
const auto = new Car("honda", "accord", 1998);
console.log(auto instanceof Car); // true
console.log(auto instanceof Object); // true
console.log(Car instanceof Object); // true
console.log(Car instanceof Function); // true
console.log(auto instanceof Function); // false

function myInstanceOf(obj, source) {
  if (obj == null) return false;
  if (typeof obj === "object" || typeof obj === "function") {
    let proto = Object.getPrototypeOf(obj);
    while (proto) {
      if (proto === source.prototype) return true;
      proto = Object.getPrototypeOf(proto);
    }
  }

  return false;
}

console.log("------------华丽的分割线-------------");

console.log(myInstanceOf(auto, Car)); // true
console.log(myInstanceOf(auto, Object)); // true
console.log(myInstanceOf(Car, Object)); // true
console.log(myInstanceOf(Car, Function)); // true
console.log(myInstanceOf(auto, Function)); // false