Perda de contexto no código de método em POO em JavaScript

Ao usar o código original de um método de classe, o contexto pode ser perdido. Vamos ver um exemplo. Suponha que temos a seguinte classe:

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

Vamos criar um objeto desta classe:

javascriptlet user = new User('john');

Vamos registrar o código do método em uma variável:

javascriptlet func = user.getName;

No momento em que o método foi registrado na variável, o contexto foi perdido. Agora this dentro do código do método não irá apontar para o objeto da classe. Vamos verificar, vamos chamar nossa função:

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

Para resolver o problema, você pode vincular o contexto à função, por exemplo, através de bind:

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