1

以下は、私がここで質問する原因となっている状況を示す抽象的な JavaScript コード サンプルです。

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.
            }
        });
    };  
};

私の質問は - それが適用される Window オブジェクトではなく、そのクラスへの this.privilegedMethod() 参照を呼び出すことができる別の方法はありますか?

または、機能を維持しながらコードを再構築する方法を提案してください。主要なイベントはグローバルにリッスンされ、プライベート変数を変更する方法はクラス外でアクセスできますが、プライベート変数自体はそうではありません。

PS特権メソッドへの呼び出しをプライベート内に配置しても、何も変わりませんでした。

4

3 に答える 3

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));
};  
于 2012-02-11T12:38:27.793 に答える
1

keydown ハンドラー内のスコープはウィンドウ オブジェクトであるため、"this" キーワードはメソッドを持たないウィンドウを参照します。

ジェームズのソリューションはうまくいくはずです。

于 2012-02-11T12:41:43.627 に答える
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/

于 2012-02-11T12:45:21.567 に答える