Kontekstin menettäminen metodikoodissa OOP:ssa JavaScriptissä

Kun luokan metodin lähdekoodia käytetään, konteksti voi kadota. Katsotaanpa esimerkkiä. Oletetaan, että meillä on seuraava luokka:

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

Luodaan objekti tästä luokasta:

javascriptlet user = new User('john');

Kirjoitetaan metodin koodi muuttujaan:

javascriptlet func = user.getName;

Hetkellä, jolloin metodi kirjoitetaan muuttujaan, konteksti katosi. Nyt this metodikoodin sisällä ei viittaa luokan objektiin. Tarkistetaan, kutsukaamme meidän funktiota:

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

Ongelman ratkaisemiseksi voimme sitoa kontekstin funktioon, esimerkiksi käyttämällä bind:ia:

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