2011-12-26 4 views
0

Я знаю, что массивы Javascript на самом деле являются объектами, и поскольку они являются объектами, они могут иметь свойства. Вот пример:Есть ли недостатки для хранения свойств в массивах Javascript?

var a = [1, 2, 3]; 
a.currentIndex = 2; 
a.next = function() { ... }; 
a.prev = function() { ... }; 

a.length // returns 3 

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

Вот мой вопрос:

Кто-нибудь знает какие-либо проблемы с хранением свойств в массиве JavaScript? Он работает во всех браузерах? Есть ли какие-либо доказательства того, что это изменится с будущими версиями Javascript? Есть ли общая мудрость относительно того, является ли это хорошей практикой?

(п.с. Для записи, мне не нужно перебирать массив с для ... в цикле. Я понимаю, что такой цикл будет включать в себя свойство, а)

ответ

1

Просто выбросить еще одну вещь - Ни одна из функций «копирование» массив прототипов не будет копировать любой из ваших дополнительных свойств, если это важно, то есть .splice, .slice, concat даст вам новые «чистые» массивы без currentIndex, и т.д.

2

Поскольку вы уже правили вне вопроса for in, мой ответ здесь ясный «нет» - беспокоиться не о чем. Все методы Array.prototype будут применяться только к «индексированным» клавишам (0 ... n).

Лучшим примером здесь является хорошо известная библиотека jQuery, она также использует объекты Array-Like для хранения узлов DOM, но также имеет множество методов, которые привязаны к этому объекту (jQuery использует прототип там tho). Однако другие библиотеки, такие как Zepto, просто помещают эти методы непосредственно в объект «массив».

Так что опять нет никаких других оговорок, и вы спасаете это.

0

Да, он работает во всех браузерах. И это действительно javascript (массивы - это объекты). Можно подумать о нескольких причинах, по которым вы хотите использовать конструктор Array вместо объекта, но если это ваш предпочтительный стиль кодирования, пойдите с ним.

Смежные вопросы