aleksand44
@aleksand44

Почему Array.prototype является массивом, но к нему нельзя обратиться по индексу?

Судя по документации и выводу в консоли, Array.prototype - массив.
Но массив странный с length = 0, и невозможностью обратиться по индексу к его элементам (методы содержащиеся в нем находятся, напротив, по ключу).
Как это вообще работает и как создать такой массив?
  • Вопрос задан
  • 90 просмотров
Пригласить эксперта
Ответы на вопрос 2
BRAGA96
@BRAGA96
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Можно обратиться по индексу:
Array.prototype.length; //0
Array.prototype[0]; //undefined, но не ошибка!
Array.prototype[0]=123; 
Array.prototype[0]; //Теперь 123
Array.prototype.length; //Теперь 1 (автоматически)

Возможно, вы думали, что массивы не могут содержать свойств? Но массивы - объекты, так что могут:
typeof Array.prototype; //"object"
var a = [];
typeof a; //"object";
a.x = 123;
a.x; //123
a.length; //0

Кстати, мысль о том, что Array.prototype это массив, довольно спорная, не смотря на документацию. Смотря как проверять:
[] instanceof Array; //true
Array.prototype instanceof Array; //false

Чтобы сказать, как создать такой массив, чтобы он не был массивом, вы должны уточнить, зачем вам это нужно, то есть в чем заключается проблема. Например, если вам нужно обмануть какой-то чужой код, то желательно привести хотя бы пример, как осуществляется проверка на массив в том чужом коде. И какая выгода от обмана. Ведь можно найти другое решение.

А в общем случае ответить нельзя, потому что массив или не массив это просто термин. Например, если вам достаточно, чтобы массив содержал лишь метод forEach, то некоторые якобы массивы вам тоже вполне сгодятся:
document.querySelectorAll('div').forEach; //function - подходит
document.getElementsByTagName('div').forEach; //undefined - не подходит

То есть копать можно долго в эту тему. Но надо понимать, зачем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы