Прототипы ES6 Class - разрешение типов - PullRequest
0 голосов
/ 21 сентября 2018

Вот пример использования

Я расширил класс 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
            ...
*/

Может кто-нибудь объяснить, в чем разница между Array и Array(0)в прототипах типа.Кроме того, почему первый прототип является экземпляром Array, когда его конструктор является классом ExtendedArray и когда он создан на основе методов в определении тела класса.Я бы ожидал, что к эфиру будет Object или ExtendedArray по типу?

Любая помощь в понимании этого поведения была бы великолепна.

Я попытался исследовать это и нашел информацию, объясняющую, где различные поля и методы класса находятся в результирующем объекте, но не то, как разрешаются типы объектов-прототипов.

1 Ответ

0 голосов
/ 21 сентября 2018

«Типы», показанные в отладчике, довольно бессмысленны.Они просто пытаются быть полезными в случаях, но обычно вызывают путаницу с объектами-прототипами.Они также различаются в разных браузерах и часто меняются в разных версиях devtools.

Все эти значения являются просто объектами, а их структура и цепочка прототипов - именно то, что вы ожидаете.

Чторазница между Array и Array(0)?

Объект Array.prototype имеет свойство .length = 0.Ваш ExtendedArray.prototype не имеет.

Почему первый прототип является экземпляром Array, когда его конструктором является класс ExtendedArray.Я бы ожидал, что эфир будет Object или ExtendedArray по типу?

Это не ExtendedArray экземпляр - он не наследуется от ExtendedArray.prototype (потому что это это ExtendedArray.prototype).Это просто объект типа {constructor: ExtendedArray}.

Однако он наследуется от Array.prototype, так что это то, что отображается как «тип».

...