2011-07-04 22 views
2

これは私の前の質問Access instance variable inside a function in javascript?の後継の質問です。プロトタイプメソッド内の無名関数内のインスタンス変数にアクセスする

プロトタイプメソッド内の無名関数内のインスタンス変数にアクセスしたいと考えています。

function MyObject(){ 

    //Instance variables 
    this.handler; 

} 
//Methods 
MyObject.prototype.enableHandler = function(){ 
    var button = document.getElementById('button'); 
    button.onclick = function(){ 
     this.handler();//Is not working 
    } 
} 
var myObject = new MyObject(); 
myObject.handler = function(){ 
    alert('Hello World!'); 
} 
myObject.enableHandler(); 

JSFiddle http://jsfiddle.net/3cmvZ/

上記の例では、Iプロトタイプメソッド内匿名関数の内部インスタンス変数にアクセスする方法を明らかにすることだけでした。私はすでにbutton.onclick = this.handlerが働いていることを知っています。

答えて

2

this.handlerは同じ範囲にありません。

MyObject.prototype.enableHandler = function() { 
    var button = document.getElementById("button"); 
    button.onclick = this.handler; 
} 

イベントを直接呼び出すだけで、別の関数でラップする必要はありません。あなたのコメントに基づいて

更新:あなたは無名関数と同じスコープ内にあるローカル変数を作成する必要があり

MyObject.prototype.enableHandler = function() { 
    var button = document.getElementById("button"); 
    var $this = this; 

    button.onclick = function() { 
     $this.handler(); 
    } 
} 

+0

は例がちょうど私がプロトタイプメソッド内匿名関数の内部でインスタンス変数にアクセスする方法を明らかにすることであることに言及し忘れました。私はすでに 'button.onclick = this.handler'が動作することを知っています – einstein

+0

@ Woho87 - 更新を参照してください。 –

+0

'$ this.handler'を変更した場合、this.handlerも変更されますか? ' – einstein

3

問題は、匿名関数がプロトタイプにあるのではなく、イベントハンドラ(メソッドとして呼び出されない)であることです。

問題は、あなたのonclickハンドラで、thisキーワードはありません、プロトタイプがオンに設定されていることをmyObjectインスタンスに、windowsオブジェクトにバインドされていることです。あなたはthat変数にオブジェクトを格納してクロージャを作成することができます。

function MyObject(){ 

    //Instance variables 
    this.handler; 

} 
//Methods 
MyObject.prototype.enableHandler = function(){ 
    var button = document.getElementById('button'); 
    var that = this; 
    button.onclick = function(){ 
     that.handler();//Should be working 
    } 
} 
var myObject = new MyObject(); 
myObject.handler = function(){ 
    alert('Hello World!'); 
} 
myObject.enableHandler(); 
+0

もし 'that.handler'を変更すると、this.handlerも変更されますか? – einstein

+0

'that'と 'this'は同じオブジェクトであり、yesです。 –

関連する問題