Как правильно обратиться к методу таким способом? Так получилось, что в классе мне нужно обратиться к уже существующему методу. Но я не могу этого сделать через this потому, что нахожусь в функции для обработки событий и this указывает на другое. Поэтому я присвоил метод переменной до обработчика. Проблема в том, что я не понимаю почему теперь нельзя обращаться к свойствам класса через эту переменную, хотя она является ссылкой на метод класса. Ниже прикреплю упрощенный код без обработчика, как пример,и сам проблемный код. А еще, если вы знаете как исправить ситуацию с this в обработчике, то напишите пожалуйста как.
Наглядный пример:class Test{
constructor(a){
this.a = a;
}
sqrA(){
console.log(this.a * this.a)
}
testA(){
let f = this.sqrA;
console.log(f())
}
}
obj = new Test(5);
obj.testA();
Ошибка:
console.log(this.a * this.a)
^
TypeError: Cannot read property 'a' of undefined
Основной код:let curr_month = this.curr_mon;
let curr_year = this.curr_year;
let newMonth = this.setNewMonth;
let baseEl = this.baseEl;
$('#next').on('click',function (e) {
curr_month++;
if(curr_month == 12){
curr_year++;
curr_month = 0;
}
newMonth(baseEl, curr_month, curr_year);
})

21 Авг 2019 в 06:59
172 +1
0
Ответы
1

Проблема в вашем примере заключается в том, что при присваивании метода объекта переменной, теряется контекст выполнения (this), и когда этот метод вызывается через переменную, this уже не указывает на объект, у которого был вызван метод.

Чтобы исправить эту проблему, вам нужно явно указать контекст выполнения метода через метод bind(). Вот как это можно сделать в вашем примере:

testA(){
let f = this.sqrA.bind(this);
console.log(f());
}

Теперь метод sqrA будет вызываться с контекстом объекта Test, и вы сможете обращаться к свойствам объекта через this.

Если вы хотите исправить ситуацию с this в обработчике событий, также используйте bind() для сохранения контекста выполнения:

$('#next').on('click',function (e) {
curr_month++;
if(curr_month == 12){
curr_year++;
curr_month = 0;
}
newMonth(baseEl, curr_month, curr_year);
}.bind(this))
20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир