0

Firefox拡張機能の場合、私は次のことを行おうとしています。

  1. 2つのメソッドとフィールド/プロパティ/属性を使用してオブジェクトを設定します
  2. メソッドの1つは、他のメソッドを呼び出して属性にアクセスできる必要があります
  3. そのメソッドをイベントリスナーとして登録したい。

今、私はそれをクラスのように設定しています:

var Obj = {
  field: null,
  a: function() { }
  b: function() {
    Obj.field = 'x';
    Obj.a();
  }
}

window.addEventListener('mouseup', Obj.b, false);

Objしかし、modが「外部から」オブジェクトを参照するのではなく(たとえば、を使用して)、代わりにを使用することは可能であるように思われますthis。ただし、これを正しく機能させる方法を理解できず、単純な関数参照をに渡し、addEventListener() できれば)単一の名前で名前空間を汚染するだけです。それは可能ですか?グーグルで検索してみたところ、たとえばhttp://ejohn.org/blog/simple-class-instantiation/が見つかりましたが、クリーンなセットアップの基準に合うものにはならないようでした。

4

2 に答える 2

3

ES5bind機能を使用します。

var Obj = {
  field: null,
  a: function() { }
  b: function() {
    this.a = 'x';
    this.a();   //Note: not sure what you're trying to do, but calling a string like a function won't work.
  }
}

window.addEventListener('mouseup', Obj.b.bind(Obj), false);
于 2012-04-21T16:42:43.253 に答える
3

bind間違いなく良いアプローチです。ただし、メソッドは、関数ではなく、 EventListenerインターフェイスaddEventListenerを実装するオブジェクトを受け入れることができることに注意してください。

var Obj = {
  field: null,
  a: function() { },
  b: function() {
    this.field = 'x'; // if you overrides `a` you can't call it
    this.a();
  },

  handleEvent: function(event) {
    switch(event.type) {
      case "mouseup":
         this.b();
         break;
    }
  }
}

window.addEventListener('mouseup', Obj, false);

Objこれは、に関連する複数のイベントがある場合、および/または同じオブジェクトの複数のインスタンスがある場合(ケースではない)に役立ちます。

于 2012-04-21T17:00:16.383 に答える