Ztráta kontextu v kódu metody v OOP v JavaScriptu

Při použití zdrojového kódu metody třídy může dojít ke ztrátě kontextu. Podívejme se na příklad. Předpokládejme, že máme následující třídu:

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

Vytvořme objekt této třídy:

javascriptlet user = new User('john');

Zapišme kód metody do proměnné:

javascriptlet func = user.getName;

V okamžiku zápisu metody do proměnné došlo ke ztrátě kontextu. Nyní this uvnitř kódu metody nebude ukazovat na objekt třídy. Ověřme, zavolejme naši funkci:

javascriptconsole.log(func()); // chyba

K vyřešení problému lze navázat kontext na funkci, například pomocí bind:

javascriptfunc = func.bind(user);
console.log(func()); // funguje