js instanceof 和 constructor

37 阅读1分钟
  • instanceof
    • 是检查一个对象的原型链上是否有对应构造函数的prototype属性
      • 下面实现一个简单的instanceof实现
          function myInstanceOf(obj,constructor){ 
              // 获取对象的直接原型 等价于obj.__proto__
              let proto = Object.getPrototypeOf(obj); 
        
              while(proto !== null){
                  if(proto == constructor.prototype){
                      return true;
                  }
                  proto = Object.getPrototypeOf(proto);
              }
        
              return false;
          }
        
        
          function myFn() {}
          const obj = new myFn();
        
          console.log(myInstanceOf(obj, myFn)); // true
          console.log(myInstanceOf(obj, Array)); // false
        
  • constructor
    • 每个对象都有一个 constructor 属性,指向创建该对象的构造函数。
      • 直接访问对象的构造函数。
      • 不会查找整个原型链,仅检查当前对象或其直接原型上的 constructor
      • 容易被篡改,不够稳定。
        function Person() {} const p = new Person();
        console.log(p.constructor === Person); // true 
        p.constructor = String; 
        console.log(p.constructor === Person); // false (⚠️ 被修改后失效)
        
      • 在原型链中,如果对象自身没有 constructor,就会从原型中继承:
        function Animal() {} 
        function Dog() {} 
        Dog.prototype = Object.create(Animal.prototype); 
        const dog = new Dog(); 
        console.log(dog.constructor === Animal); // true(⚠️ 不符合预期)