Perdita del contesto nel codice del metodo in OOP in JavaScript

Quando si utilizza il codice sorgente di un metodo di classe, il contesto può andare perso. Vediamo un esempio. Supponiamo di avere la seguente classe:

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

Creiamo un oggetto di questa classe:

javascriptlet user = new User('john');

Assegniamo il codice del metodo a una variabile:

javascriptlet func = user.getName;

Nel momento in cui il metodo viene assegnato alla variabile, il contesto si è perso. Ora this all'interno del codice del metodo non punterà all'oggetto della classe. Verifichiamolo, chiamiamo la nostra funzione:

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

Per risolvere il problema, è possibile associare il contesto alla funzione, ad esempio, tramite bind:

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