Почему свойство длины принадлежит объекту массива?

Есть и другие примеры, но для простоты возьмем свойство length, что оно здесь делает:

[].hasOwnProperty("length")
//==> true

Как мы знаем, свойство length массива находится в Array.prototype, поэтому к нему легко получить доступ из любого экземпляра массива, просто пройдя вверх по цепочке прототипов, зачем копировать его вниз? Это как-то связано с конкретной реализацией в браузере? (пример кода выше, выполненный в консоли Chrome). Даже MDN ясно говорит, что: ...методы и свойства не копируются из одного объекта в другой в цепочке прототипов. Доступ к ним можно получить, поднявшись по цепочке...


person zepeersGily    schedule 05.08.2021    source источник
comment
Как мы знаем, свойство длины массива находится в Array.prototype - эээ, не совсем, это не так.   -  person Bergi    schedule 06.08.2021
comment
Если бы свойство было в объекте-прототипе, то как оно могло бы отличаться для экземпляра массива с 2 элементами и массива с 200?   -  person Pointy    schedule 06.08.2021
comment
@Pointy Я предполагаю, что вы могли бы реализовать это с помощью геттера на прототипе, который считывает длину из this? Но это не похоже на то, что это было бы так же эффективно, как если бы каждый массив хранил свою собственную длину, и, возможно, не работал в ранних версиях ES.   -  person Robin Zigmond    schedule 06.08.2021
comment
@RobinZigmond да, это было бы возможно, но свойство .length намного предшествует средству получения; .length существует с 90-х. Это свойство экземпляра.   -  person Pointy    schedule 06.08.2021


Ответы (1)


Просто: потому что каждый экземпляр массива имеет другое значение .length.

Свойство .length могло быть геттером/сеттером, унаследованным от общего объекта-прототипа, но первоначальный дизайн JavaScript включал свойство данных, которое автоматически обновлялось при создании/удалении элемента.

length собственность находится на Array.prototype

Существует свойство Array.prototype.length, но только потому, что Array.prototype сам по себе является массивом. Обратите внимание, что его значение равно 0 — вы бы не хотели, чтобы оно наследовалось для всех массивов.

person Bergi    schedule 05.08.2021
comment
Array.prototype сам по себе является массивом, который был недостающей точкой — еще один пробел в знаниях закрыт, спасибо - person zepeersGily; 06.08.2021
comment
@zepeersGily Да, это действительно странное дизайнерское решение, и о нем мало что известно, потому что оно ни для чего не важно. Вероятно, это не был бы массив, если бы JS был разработан сегодня, но он такой, какой он есть, и его нельзя изменить по соображениям совместимости. - person Bergi; 06.08.2021
comment
См. также все эти ответы, касающиеся темы. - person Bergi; 06.08.2021