2013-09-01 3 views
0
var primes=[2,3,5,7] 
primes.sync = function(){this[0]=23;} 

primes // => [2, 3, 5, 7] 

primes.sync() 

primes // => [23, 3, 5, 7] 

Это, кажется, отлично работает в Chrome.Прикрепление функции к массиву

Есть ли причины не использовать этот синтаксис/«особенность»? Кроме того, могу ли я рассчитывать на primes, чтобы вести себя как обычный массив (например, при передаче его функции, ожидающей массив)?


Вот почему я хочу использовать:

Скажем, у меня есть в моей программе в peopleList. Функции во всем приложении будут использовать его как массив. Затем, внезапно, я делаю POST на сервере. Затем я хочу, чтобы массив запрашивал сервер напрямую и сам обновлялся. Это позволило бы использовать очень элегантный код в моем приложении angular.js.

ответ

3

Единственная проблема, с которой вы, скорее всего, столкнетесь, будет, если вы (неправильно) попытаетесь использовать for-in для повторения массива. До тех пор, пока вы используете оператор for или один из методов итератора массива для ограничения перечисления на числовые индексы, не должно быть никаких проблем.

Массив будет продолжать вести себя как типичный массив.

+0

и так же следует избегать циклов for-in для итерации массива. Нет гарантии по порядку возврата ключей. –

+0

@MattGreer: Согласен. – user2736012

+0

I ** всегда ** использовать '.forEach' или' .map' - это функциональный способ сделать это. 'for-in' уже опасен для меня, так как я использую' sugar.js' (который, кстати, является удивительной библиотекой) – kornfridge

0

Что бы вы хотели сделать, это добавить функцию в Array.prototype, а не добавлять ее в экземпляр массива. Смотри ниже.

Array.prototype.sync = function(){this[0]=23;}; 

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

var a = []; 

a.sync(); // TypeError: Object [object Array] has no method 'sync' 

Array.prototype.sync = function(){this[0]=23;}; 

a.sync(); 
a // [23] 

var b = [1,2,3]; 
b.sync(); 

b // [23, 2, 3] 

Однако, только добавить те функции, которые являются полезными/содержательную/для повторного использования в Array.prototype, потому что он будет доступен для всех экземпляров массива когда-либо созданных и будет создан.

Если ваша функция будет использоваться только несколькими экземплярами. Вам лучше добавить их в каждый экземпляр, как вы делали выше.

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