Как правильно обратиться к методу таким способом? Так получилось, что в классе мне нужно обратиться к уже существующему методу. Но я не могу этого сделать через 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
151 +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 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир