4

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);
    }
  }
}

ただし、サブスクライバーはイベント名を知っているため、省略することができます。しかし、リストから1つの引数を削除する方法がわかりません(配列ではなく、ある種のオブジェクトのように見えるため)。

また、イベント名が削除されたら、再度追加する必要があります。これは、直接のサブスクライバーに通知した後、グローバル イベント システムが作動するためです。このグローバル イベント システムには名前が必要です。

したがって、関数全体は次のようになります。

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);      

}

これをどのように実装しますか?

4

3 に答える 3

12

次のように、オブジェクトshiftからメソッドを「借用」できます。Array()

shiftメソッドをキャッシュする

shift = [].shift;

次に、それを使用しての最初の要素を取り除きますarguments(オブジェクトのような配列であるため)

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

そして@casablancaが言ったように、

多くのメソッドは、配列のように動作するもの (数値インデックスと長さプロパティ) で機能します。

メソッドはそのshift1 つにすぎません。

于 2012-11-08T19:52:54.500 に答える
2

最初の引数を削除して新しい配列を作成するだけです:

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

新しい配列をに渡しapplyます:

callbacks[i].apply(callbacks[i], newArgs);
于 2012-07-04T10:58:29.930 に答える