Förlust av kontext i metodkod i OOP i JavaScript

När man använder källkoden från en metod i en klass kan kontexten gå förlorad. Låt oss titta på ett exempel. Låt oss säga att vi har följande klass:

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

Låt oss skapa ett objekt av denna klass:

javascriptlet user = new User('john');

Låt oss spara metodkoden i en variabel:

javascriptlet func = user.getName;

I ögonblicket när metoden sparades i variabeln försvann kontexten. Nu kommer this inuti metodkoden inte att peka på klassobjektet. Låt oss kontrollera, låt oss anropa vår funktion:

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

För att lösa problemet kan man binda kontexten till funktionen, till exempel, via bind:

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