2012-07-06 13 views
6

私はので、私は例を提示してみましょう、正確にどのようにフレーズ私の質問をするかわからない:初期化関数のイベントリスナーにプロトタイプ関数を追加するにはどうすればよいですか?

function foo() { 
    window.addEventListener("keydown", function(event) { 
     bar(event.keycode); 
} 

foo.prototype.bar = function (keycode) { 
//code 
} 

私は​​を使用して試してみたが、それはthisとしてwindowを使用してになります。これを行う方法はありますか、手動で別のメソッドを初期化する必要がありますか?

答えて

7

バインドthis.barthisを渡す前に。

function foo() { 
    window.addEventListener("keydown", this.bar.bind(this), false); 
} 


foo.prototype.bar = function (event) { 
    console.log(event.keyCode); 
} 

デモhttp://jsfiddle.net/2tee4/

+0

なぜバインド? 'window.addEventListener(" keydown "、this.bar、false);'? –

+1

@SheikhHeeraので、 'bar'は' this'の文脈で呼び出されます。さもなければ、グローバルスコープで実行され、プロトタイプ関数をバインドする利点がありません。 – zzzzBov

+0

@SheikhHeera '.bind'は、バインドされた関数がどのように呼び出されても、常に同じ値になるようにこの値を修正します。この場合、常に 'foo'オブジェクトになります。 – Esailija

5

代替ソリューションあなたが利用可能Function.prototype.bind *を持っていない、とあなたはFunction.prototypeに余分な機能を追加したくないならthis.barへの呼び出しをオーバー閉じるために、次のようになります。

function foo() { 
    var self; 
    self = this; 
    window.addEventListener('keydown', function (e) { 
     self.bar(e); 
    }, false); 
} 
foo.prototype.bar = function (e) { 
    console.log(e.keyCode); 
} 

* addEventListenerattachEventなしで使用しても、Function.prototype.bindはacce ptable選択は


さらに、このようなjQueryなどのライブラリがbindの独自の形式を含むことができ、jQueryのはjQuery.proxyです。

+0

余分なオプションをありがとう、より多くの情報を持っていることは常にいいです。さらに、これが他の人のためにGoogleの検索結果になったとき... – Bloodyaugust

4

あなたの意図が作成したすべてのfooのための新しいリスナーを追加する場合は、別のオプションはfooのEventListenerインタフェースを実装します、と単純にハンドラの代わりにthisを渡すことです。

function Foo() { 
    window.addEventListener("keydown", this, false); 
} 

Foo.prototype.bar = "foobar"; 

Foo.prototype.handleEvent = function(e) { 
    console.log(e.type); // "mousedown" (for example) 
    console.log(this.bar); // "foobar" 
}; 

new Foo(); 

addEventListener()とのみ動作します。

DEMO:http://jsfiddle.net/k93Pr/

+2

jQueryがこれをサポートしていれば、私にとっては多くの '$ .proxy'定型文を取り除くことができます: – Esailija

+0

上記のコメントが却下されたので、私はチケットをリンクするつもりです:http://bugs.jquery.com/ticket/12031:P – Esailija

+1

@Esailija:それが実装されているかどうかは面白いでしょう。私はjQueryを待つことはありません。ちょうどそれをプラグインにする。ここには単純で、おそらく初めの実装があります。 '.on()'の他の署名のサポートを追加するだけです。 http://jsfiddle.net/suQEZ/ *(あなたに私にあなたのことを示す必要がなかったのは分かっていますが、他の人のためにもっとです) –