el siguiente código arrojará un error de tipo para la propiedad de nombre: No se puede asignar a la propiedad de solo lectura 'nombre' de la función.
Espero obtener el nombre de usuario 'Desconocido'. Obtengo este resultado si uso un enlace como:
const User = function(name) { this.name = name } function userMsg(msg) { this.name = this.name || 'Unknown' return `${this.name} said: ${msg}` } const newMsg = userMsg.bind(User) newMsg('say smth')Su código actual está tratando de usar la función de constructor User como this dentro userMsg . Eso causa el problema de que está ejecutando userMsg en el contexto de una function . Las funciones tienen un name de propiedad de solo lectura que no puede sobrescribir, que proviene de Function.prototype.name .
Afortunadamente, eso no es lo que quieres hacer de todos modos. Si, en lugar de vincular la función User , vincula una instancia creada llamando a la función constructora, puede ceñirse al name de su propiedad:
const User = function(name) { this.name = name } function userMsg(msg) { this.name = this.name || 'Unknown' return `${this.name} said: ${msg}` } const max = new User('Max'); // you need a User instance to bind to const newMsg = userMsg.bind(max); // bind it here console.log(newMsg('say smth')); En el uso real, probablemente tampoco quiera usar bind , sino agregar userMsg a User.prototype :
const User = function(name) { this.name = name } User.prototype.userMsg = function(msg) { return `${this.name} says: ${msg}` } const max = new User('Max'); const newMsg = max.userMsg('Hello!'); // now we can call the function on the user console.log(newMsg); o al menos, no lo bind de forma permanente, sino que use call para usar el contexto de usuario una vez:
const User = function(name) { this.name = name } function userMsg(msg) { this.name = this.name || 'Unknown' return `${this.name} said: ${msg}` } const max = new User('Max'); const newMsg = userMsg.call(max, 'say smth'); // use call to set context only for this call console.log(newMsg);