Вот пример использования
Я расширил класс 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
по типу?
Любая помощь в понимании этого поведения была бы великолепна.
Я попытался исследовать это и нашел информацию, объясняющую, где различные поля и методы класса находятся в результирующем объекте, но не то, как разрешаются типы объектов-прототипов.