2012-07-04 2 views
4

Я написал наблюдателя в javascript. Вы можете активировать такие события:Удалить и добавить элементы в список аргументов функций в javascript

ClassThatExtendsEvent.triggerEvent('EventName', arg1, arg2, ..., argn) 

Существует переменное количество аргументов, при этом первым аргументом является имя события. У меня также есть подписчики, которые сохраняются в частной собственности моего класса событий. Они вызывались, как это:

Event.prototype.triggerEvent = function() { 

    var callbacks = this._events[eventName];  
    if(callbacks !== undefined) { 
    for (var i = 0, l = callbacks.length; i < l; i++) { 

     // I do not need the first argument here!!! 
     callbacks[i].apply(callbacks[i], arguments); 
    } 
    } 
} 

Однако абоненты знают название события, следовательно, это может быть пропущено. Но я не знаю, как удалить один аргумент из списка (поскольку он не является массивом, но, похоже, является своего рода объектом).

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

Поэтому вся функция выглядит следующим образом:

Event.prototype.triggerEvent = function() { 

    // First we deliver to direct subscribers 
    var callbacks = this._events[eventName];  
    if(callbacks !== undefined) { 
    for (var i = 0, l = callbacks.length; i < l; i++) { 
     // I do NOT need the first argument here!!! 
     callbacks[i].apply(callbacks[i], arguments); 
    } 
    } 

    // Now we broadcast the event to the entire system 

    // I DO need the first argument here!!! 

    Facade.getInstance().broadcastEvent.apply(Facade.getInstance(), arguments);  

} 

Как бы реализовать это?

ответ

11

вы можете «одолжить» на shift метод из Array() объекта как это:

кэш shift метод

shift = [].shift; 

затем использовать его, чтобы снять первый элемент arguments (так как это просто массив как объект)

var firstArg = shift.apply(arguments); //in case you need it 
. 
. 
. 
callbacks[i].apply(callbacks[i], arguments); 

и, как @casablanca сказал

Многие методы будут работать с чем-либо, что ведет себя как массив (числовые индексы и свойство длины)

Метод shift является лишь одним из них.

+0

Какое злобное решение! – ooxi

+0

действительно приятно!работает как шарм – cesarpachon

2

Просто создать новый массив с первым аргументом удалены:

var newArgs = []; 
for (var i = 1; i < arguments.length; i++) { 
    newArgs.push(arguments[i]); 
} 

и передать новый массив apply:

callbacks[i].apply(callbacks[i], newArgs); 
+0

Отлично. Я не знал, что могу передать новый массив ... но очевидно. – shredding

+0

@shredding: JavaScript странный. :) Многие методы будут работать со всем, что ведет себя как массив (числовые индексы и свойство 'length'). Как вы уже упоминали, 'arguments' не является истинным массивом, но его можно использовать так же, как и реальный массив для' apply'. – casablanca

1

Mohamed-Ted является правильным, но если вам не нужен первый аргумент, вы можете встраивать манипуляцию аргументов, используя Array.splice следующим образом:

callbacks[i].apply(callbacks[i], [].splice.call(arguments, 1)); 

где 1 указывает позицию в списке аргументов, которые вам хотите сохранить аргументы.

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