这是用例

Ive扩展了Array类:

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

    this.test = 10;
  }

  testTwo() {
  }
}


现在,我有一些方法可以映射我的ExtendedArray实例并返回另一个ExtendedArray实例,该实例可以直接使用。

但是在其他情况下,我想映射到ExtendedArray,但返回一个实际的Array实例,而不是我的ExtendedArray。在这种情况下,我认为我可以走__proto__链并致电.constructor

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

基于上面的类,我期望这样的层次结构

/*
  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)之间的区别是原型类型是什么。当数组的构造函数是ExtendedArray类并且根据类主体定义中的方法创建数组时,为什么第一个原型也是Array的实例。我本来希望以太类型是ObjectExtendedArray

任何帮助理解这种行为的方法都将非常有用。

我试图对此进行研究,发现了信息,这些信息解释了不同的类字段和方法在结果对象中的位置,但没有解释原型对象的类型如何解析。

最佳答案

调试器中显示的“类型”是毫无意义的。他们只是试图对实例有所帮助,但通常会导致原型对象混乱。它们在浏览器之间也有所不同,并且经常在devtools版本之间进行更改。

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


  ArrayArray(0)有什么区别?


Array.prototype对象具有.length = 0属性。您的ExtendedArray.prototype尚未。


  当第一个原型的构造函数为Array类时,为什么它是ExtendedArray的实例。我本来希望以太类型是ObjectExtendedArray


它不是ExtendedArray实例-它不继承自ExtendedArray.prototype(因为它是ExtendedArray.prototype)。就像{constructor: ExtendedArray}这样的对象。

但是,它确实是从Array.prototype继承的,因此这就是“类型”。

07-25 22:38