JavaScript: вызов функции с помощью this.не ссылается на метод в классе - PullRequest
1 голос
/ 11 февраля 2012

Вот абстрактный пример кода 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, к которому он применяется?

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

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

Ответы [ 3 ]

5 голосов
/ 11 февраля 2012
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));
};  
1 голос
/ 11 февраля 2012

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

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

0 голосов
/ 11 февраля 2012
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/

...