Tabt af kontekst i metodekode i OOP i JavaScript

Når man bruger kildekoden fra en klassemetode, kan konteksten gå tabt. Lad os se på et eksempel. Lad os sige, at vi har følgende klasse:

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

Lad os oprette et objekt af denne klasse:

javascriptlet user = new User('john');

Lad os gemme metodekoden i en variabel:

javascriptlet func = user.getName;

På det tidspunkt, hvor metoden blev gemt i variablen, gik konteksten tabt. Nu vil this inde i metodekoden ikke længere pege på klasseobjektet. Lad os teste ved at kalde vores funktion:

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

For at løse problemet kan man binde konteksten til funktionen, for eksempel via bind:

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