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