JavaScript: вызов функции с помощью this. не ссылается на метод в классе

Вот абстрактный пример кода 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.
            }
        });
    };  
};

У меня вопрос - есть ли альтернативный способ сделать вызов this.privilegedMethod() ссылкой на его класс, а не на объект Window, к которому он применяется?

Или, может быть, какие-либо предложения о том, как я мог бы реструктурировать свой код, сохраняя функциональность - ключевые события прослушиваются глобально, метод изменения закрытой переменной доступен вне класса, а сама личная переменная - нет.

PS Размещение вызова привилегированного метода внутри частного ничего не изменило.

3 ответа

Решение
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));
};  

Дело в том, что внутри обработчика keydown область видимости является объектом окна, поэтому ключевое слово "this" относится к окну, в котором нет метода you.

Решение Джеймса должно работать нормально.

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/

Другие вопросы по тегам