Pérdida de contexto en el código de un método en POO en JavaScript

Al usar el código fuente de un método de clase, el contexto puede perderse. Veamos un ejemplo. Supongamos que tenemos la siguiente clase:

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

Creemos un objeto de esta clase:

javascriptlet user = new User('john');

Escribamos el código del método en una variable:

javascriptlet func = user.getName;

En el momento de escribir el método en la variable, el contexto se perdió. Ahora this dentro del código del método no apuntará al objeto de la clase. Comprobemos, llamemos a nuestra función:

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

Para resolver el problema, se puede vincular el contexto a la función, por ejemplo, a través de bind:

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