Как правильно обратиться к методу таким способом? Так получилось, что в классе мне нужно обратиться к уже существующему методу. Но я не могу этого сделать через 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); })
Проблема в вашем примере заключается в том, что при присваивании метода объекта переменной, теряется контекст выполнения (this), и когда этот метод вызывается через переменную, this уже не указывает на объект, у которого был вызван метод.
Чтобы исправить эту проблему, вам нужно явно указать контекст выполнения метода через метод bind(). Вот как это можно сделать в вашем примере:
testA(){ let f = this.sqrA.bind(this); console.log(f()); }
Теперь метод sqrA будет вызываться с контекстом объекта Test, и вы сможете обращаться к свойствам объекта через this.
Если вы хотите исправить ситуацию с this в обработчике событий, также используйте bind() для сохранения контекста выполнения:
Проблема в вашем примере заключается в том, что при присваивании метода объекта переменной, теряется контекст выполнения (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))