Потеря контекста в коде метода в ООП в JavaScript
При использовании исходного кода метода класса может потеряться контекст. Давайте посмотрим на примере. Пусть у нас есть следующий класс:
class User {
#name;
constructor(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
Создадим объект этого класса:
let user = new User('john');
Запишем код метода в переменную:
let func = user.getName;
В момент записи метода в переменную
контекст и потерялся. Теперь this
внутри кода метода не будет указывать
на объект класса. Проверим, вызовем
нашу функцию:
console.log(func()); // ошибка
Для решения проблемы можно привязать
контекст к функции, например,
через bind
:
func = func.bind(user);
console.log(func()); // работает