ES6 Class 原型 - 类型解析

ES6 Class prototypes - type resolution

这是用例

我扩展了数组 class:

class ExtendedArray extends Array {
  constructor(...args) {
    super(...args);

    this.test = 10;
  }

  testTwo() {
  }
}

现在我有一些方法可以映射我的 ExtendedArray 实例和 return 另一个开箱即用的 ExtendedArray 实例。

然而在其他情况下,我想映射到 ExtendedArray 但 return 一个实际的 Array 实例而不是我的 ExtendedArray。在这种情况下,我想我可以走上 __proto__ 链并调用 .constructor.

这是我注意到一些我没想到的奇怪行为的时候。

基于上面的 class,我会期待这样的层次结构

/*
  ExtendedArray
    test: 10
    __proto__: Object
        testTwo: () {}
      __proto__: Array
        forEach
        ...
        __proto__: Object
            ...
*/

但是我得到了这样的一个:

/*
  ExtendedArray
    test: 10
    __proto__: Array -- Different
        constructor: class ExtendedArray
        testTwo: () {}
      __proto__: Array(0) -- Different
        constructor: f Array()
        forEach
        ...
        __proto__: Object
            ...
*/

任何人都可以解释一下 ArrayArray(0) 之间在原型类型上的区别。还有为什么第一个原型是 Array 的实例,当它的构造函数是 ExtendedArray class 并且它是基于 class 主体定义中的方法创建时。我原以为 to ether 是 ObjectExtendedArray 类型?

如果能帮助理解这种行为,那就太好了。

我试图对此进行研究,并找到了解释不同 class 字段和方法在结果对象中的位置的信息,但没有说明原型对象的类型是如何解析的。

调试器中显示的 "types" 毫无意义。他们只是试图在实例上提供帮助,但通常会导致原型对象的混淆。它们在浏览器之间也不同,并且经常在 devtools 版本之间变化。

所有这些值都是简单的对象,它们的结构和原型链正是您所期望的。

What is the difference between Array and Array(0)?

Array.prototype 对象有一个 .length = 0 属性。你的ExtendedArray.prototype还没有。

Why is the first prototype an instance of Array when its constructor is the ExtendedArray class. I would have expected that to ether be an Object or ExtendedArray in type?

它不是 ExtendedArray 实例 - 它不是从 ExtendedArray.prototype 继承的(因为它 ExtendedArray.prototype)。它只是一个像 {constructor: ExtendedArray}.

这样的对象

但是它确实继承自 Array.prototype,所以这就是显示为 "type"。