2012-02-11 10 views
1

のメソッドに参照していませんここに質問をする私を引き起こしている状況を示す抽象JavaScriptコードのサンプルです:私の質問があるJavaScript: 'this'を含む関数の呼び出しここでは、クラス

function className(){  
    var private_variable = 0;   
    function privateMethod(){ 
     // Some irrelevant code. 
    };  
    this.privilegedMethod = function(){ 
     // Some relevant code to determine if private variable needs to be modified. 
     private_variable+=val; // Modifies private variable. 
    };  
    this.init = function() { 
     $(window).keydown(function (key) { 
      if (key.which == 13) { 
       privateMethod(); // Call to private method works fine. 
       this.privilegedMethod(); // 'this' references Window object, 
              // not this class method as expected. 
      } 
     }); 
    }; 
}; 

を - 私は電話をかけることができます別の方法がありますthis.privilegedMethod()は、それが適用されているWindowオブジェクトではなく、そのクラスを参照していますか?

キーのイベントをグローバルにリッスンし、プライベート変数を変更する方法はクラスの外部からアクセスできますが、プライベート変数自体は機能しません。

P.S.特権メソッドへの呼び出しをプライベート内部に置いても、何も変更されませんでした。

答えて

5
this.init = function() { 
    var that = this; 
    $(window).keydown(function (key) { 
     if (key.which == 13) { 
      privateMethod(); 
      that.privilegedMethod(); 
     } 
    }); 
}; 

または

this.init = function() { 
    $(window).keydown($.proxy(function (key) { 
     if (key.which == 13) { 
      privateMethod(); 
      this.privilegedMethod(); 
     } 
    }, this)); 
}; 
+0

高速応答をありがとう。魅力のように働く。 – user1203684

+0

彼があなたの質問に答えた場合にはAnsweredとマークしてください – Paul

+1

私は、このように使われている変数の "self"は "this"の代わりに他の言語が使っているので、より同義語だと思います。 –

1

取引がKeyDownイベントハンドラ内でスコープはwindowオブジェクトであるということですので、「これ」キーワードは、あなたの方法を持っていないウィンドウを指します。

Jamesソリューションは正常に動作するはずです。

0
function className(){  
    var private_variable = 0;   
    function privateMethod(){ 
     // Some irrelevant code. 
    };  
    this.privilegedMethod = function(){ 
     // Some relevant code to determine if private variable needs to be modified. 
     private_variable+=val; // Modifies private variable. 
    };  

    this.init = function() { 
     var handle = $.proxy(this.privilegedMethod, this); 
     $(window).keydown(function (key) { 
      if (key.which == 13) { 
       privateMethod();  
       handle();             
      } 
     }); 
    }; 
}; 

http://api.jquery.com/jQuery.proxy/

関連する問題