Потеря контекста в коде метода в ООП в JavaScript

При использовании исходного кода метода класса может потеряться контекст. Давайте посмотрим на примере. Пусть у нас есть следующий класс:

javascriptclass User {
  #name;
  
  constructor(name) {
    this.#name = name;
  }
  getName() {
    return this.#name;
  }
}

Создадим объект этого класса:

javascriptlet user = new User('john');

Запишем код метода в переменную:

javascriptlet func = user.getName;

В момент записи метода в переменную контекст и потерялся. Теперь this внутри кода метода не будет указывать на объект класса. Проверим, вызовем нашу функцию:

javascriptconsole.log(func()); // ошибка

Для решения проблемы можно привязать контекст к функции, например, через bind:

javascriptfunc = func.bind(user);
console.log(func()); // работает