Utrata kontekstu w kodzie metody w OOP w JavaScript

Przy użyciu oryginalnego kodu metody klasy kontekst może zostać utracony. Spójrzmy na przykład. Załóżmy, że mamy następującą klasę:

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

Stwórzmy obiekt tej klasy:

javascriptlet user = new User('john');

Zapiszmy kod metody w zmiennej:

javascriptlet func = user.getName;

W momencie zapisania metody do zmiennej kontekst został utracony. Teraz this wewnątrz kodu metody nie będzie wskazywać na obiekt klasy. Sprawdźmy, wywołajmy naszą funkcję:

javascriptconsole.log(func()); // błąd

Aby rozwiązać problem, można powiązać kontekst z funkcją, na przykład przez bind:

javascriptfunc = func.bind(user);
console.log(func()); // działa