2009-09-02 14 views
11

JavaScriptのプロトタイプクラスのメンバー変数にイベントハンドラでアクセスしようとしています。 "それ"(イベントハンドラの場合は[これのコピー])。言うまでもなく、私はいくつかの問題に遭遇しています。JavaScriptプロトタイプオブジェクトを使用する場合のイベントメソッドの "this"キーワード

テイク、例えば、このHTMLスニペット:

<a id="myLink" href="#">My Link</a> 

そして、このJavaScriptコード:

function MyClass() 
{ 
    this.field = "value" 
    this.link = document.getElementById("myLink"); 
    this.link.onclick = this.EventMethod; 
} 

MyClass.prototype.NormalMethod = function() 
{ 
    alert(this.field); 
} 

MyClass.prototype.EventMethod = function(e) 
{ 
    alert(this.field); 
} 

は、MyClassのオブジェクトをインスタンス化し、NormalMethodを呼び出すことは、私は(アラ​​ートが「言ってそれを期待するとまったく同じように動作しますこの "キーワードがイベントターゲット(anchor()HTML要素)を参照するため、リンクをクリックすると結果は未定義の値になります。

私はプロトタイプのJavaScriptスタイルに新たなんだけど、過去に、閉鎖で、私は単にコンストラクタで「この」のコピーを作った:

var that = this; 

そして、私はメンバーにアクセスすることができました"that"オブジェクト経由のイベントメソッドの変数。プロトタイプコードでは動作しないようです。これを達成する別の方法がありますか?

ありがとうございました。

+0

あなたはPrototypeライブラリーや、むしろストレートJavaScriptのプロトタイプのクラスを参照している:この質問は、全体のプロトタイプ・ライブラリを含めずにbindメソッドの実装で、ここで回答されている別のSOの質問の重複していますか? –

+3

3年遅れて返答:)しかし、後世のために:私はストレートJavaScriptのプロトタイプのクラスを指していました。 – Michael

+0

[正しいコールバックの 'this/contextにアクセスするには?](http://stackoverflow.com/q/20279484/1048572)の重複がありますか? – Bergi

答えて

9

あなた"that=this"閉鎖イディオムはまだ適用されます。

function MyClass() 
{ 
    ... 

    var that = this; 
    this.link.onclick = function() { 
     return that.EventMethod.apply(that, arguments); 

     // that.EventMethod() works too here, however 
     // the above ensures that the function closure 
     // operates exactly as EventMethod itself does. 

    }; 
} 
5

あなたが必要

this.link.onclick = this.EventMethod.bind(this); 
13

試してみてください:

this.link.onclick = this.EventMethod.bind(this); 

... 'バインドは' プロトタイプの一部であり、 'this'が正しく設定された状態でメソッドを呼び出す関数を返します。

+0

'onclick'はどのようにイベントインターフェースにアクセスできますか? – Karl

+0

@Karl「イベントインターフェイスへのアクセス」とは、「イベントオブジェクトを引数として受け取る」という意味ですか? 'bind'メソッド**は関数**(固定' this ')を返します。したがって、 'onclick = this.EventMethod'は基本的に' onclick = this.EventMethod.bind(this) 'と同じです。どちらの場合も、 'onclick'プロパティに関数を格納します。それらの引数がどのように扱われるかという点では同じです。引数がリスナー関数にどのように引き渡されるかについてのより一般的な質問がある場合、それはここで質問されているものとはかなり異なる質問です。新しい質問をする必要があります。 – apsillers

0

上記のように、Prototypeライブラリの一部であるbindを使用することは、この問題を解決するためのきれいな方法です。

https://stackoverflow.com/a/2025839/1180286

+0

その質問はJQueryを使用しています。私は純粋なJavaScript質問/答えが標準であることをむしろ見たいと思う。 –

関連する問題