代码之家  ›  专栏  ›  技术社区  ›  Nurbol Alpysbayev

为什么Object.getPrototypeOf(instance.constructor)不等于instance.constructor.prototype?[副本]

  •  3
  • Nurbol Alpysbayev  · 技术社区  · 6 年前

    标题说明了一切,但下面是代码:

    class A {}
    class B extends A {}
    
    const b = new B()
    
    
    Object.getPrototypeOf(b.constructor) === b.constructor.prototype // false
    
    Object.getPrototypeOf(b.constructor) === A // true
    b.constructor.prototype === A // false. why?
    

    我是说,上面的代码是违反直觉的。为什么是这样做的?

    2 回复  |  直到 6 年前
        1
  •  2
  •   UtkarshPramodGupta    6 年前

    __proto__ prototype 不一样。

    假设你有一个物体 obj . 现在, obj.prototype 不会给你提供 目标 ,如你所料。得到 目标 你必须这么做 obj.__proto__ . 运行以下代码,您将得到答案。另外,请阅读 this 更多地了解 __原型__ 原型 . :)

    class A {}
    class B extends A {}
    
    const b = new B()
    
    console.log(Object.getPrototypeOf(b.constructor) === b.constructor.__proto__) // true
    console.log(Object.getPrototypeOf(b.constructor) === A) // true
    console.log(b.constructor.__proto__ === A) // true
        2
  •  1
  •   Willem van der Veen    6 年前

    在你的代码中:

    b.constructor.prototype === A; // false
    

    这是错误的,因为b的原型是A的原型,而不是A本身。一开始这听起来可能很混乱,所以我留下了一个例子:

    class A {}
    class B extends A {}
    
    const b = new B()
    
    
    Object.getPrototypeOf(b.constructor) === b.constructor.prototype // false
    
    Object.getPrototypeOf(b.constructor) === A // true
    b.constructor.prototype === A // false. why?
    
    console.dir(b.constructor.__proto__ === A); // true

    在上一个语句中的这个示例中:

    console.dir(b.constructor.__proto__ === A); // true
    

    这个 __proto__ b的属性实际上是指同一个对象A。

    您可能会发现以下内容也很有趣:

    class A {}
    
    console.log(typeof A); // constructors are merely masked functions with added functionality
    
    console.log(typeof A.__proto__);  // constructors inherit from the Function object
    
    console.log(typeof A.__proto__.__proto__); // the Function object inherits from Object object