En el método sendTo del usuario, traté de vincular la función definida anteriormente y enviar this.name como primer argumento. Pero si intento iniciar sesión en la consola, this.name devuelve undefind. ¿Cómo vincular correctamente el contexto del objeto del usuario al método sendTo ()?
function sendFrom(from, to, text) { console.log(this); return `${from}'s packet --> ${to} \nmessage: ${text}`; } let user = { name: "Alex", sendTo: sendFrom.bind(this, this.name), } user.sendTo = user.sendTo.bind(user); console.log(user.sendTo("John", "some message")); {} undefined's packet --> John message: some messageSupongo que puede lograr el comportamiento esperado al no usar ningún enlace:
function sendFrom(to, text) { console.log(this); return `${this.name}'s packet --> ${to} \nmessage: ${text}`; } let user = { name: "Alex", sendTo: sendFrom } console.log(user.sendTo("John", "some message"));Pero si desea ejecutar el método del usuario en otro lugar que cuando entra en juego el enlace:
let alexeSendTo = user.sendTo alexesSendTo('John', 'Hey John!') // it will loose Alex's user context link let alexeSendTo = user.sendTo.bind(user) alexesSendTo('John', 'Hey John!') // now it is marked as Alex messagePara entender por qué esto no funciona, debe mirar el objeto de user :
sendTo: sendFrom.bind(this, this.name),
Esta propiedad dentro del user es lo que está causando el problema. Cuando se ejecuta this código, pertenece al objeto de la ventana y no al usuario.
Así que finalmente sendTo es un método con contexto como window y primer parámetro como window.name
Es por eso que console.log(this) devuelve el objeto de ventana.
Cuando haga esto: console.log(user.sendTo("John", "some message"));
Está agregando los parámetros "John" y "some message" después del parámetro ya agregado.
Entonces, finalmente, los parámetros se convierten en:
from, to, text -> window.name (indefinido en su caso), John, algún mensaje
Cada vez que usa this en este código, se refiere a la ventana. En realidad, no hay forma de entender la vinculación aquí y este ejemplo no es donde debería usar bind