Dado lo siguiente:
function MyClass() { this.name = "Agnus" return function() { console.log(this.name) } } const user = new MyClass() //this = "MyClass" const r = MyClass() //this = "window" console.log(name) //Agnus, this = "window" r() //Agnus, this = "window"Mi expectativa era que al llamar a r (), obtendría un error ya que el valor de "esto" es una ventana para su caso, pero en su lugar me devolvió "Agnus". Al verificar, descubrí que las propiedades del constructor de objetos MyClass están disponibles en global.
Tengo pocas dificultades para entender ese comportamiento, por lo que sería muy bueno si alguien pudiera explicarme un poco sobre esto.
Gracias por tu ayuda.
Cuando usa new , establece this en un nuevo objeto vacío cuyo prototipo interno es el .prototype del constructor. Eso es:
new MyClass() function MyClass() { // `this` is now equivalent to Object.create(MyClass.prototype) Pero si devuelve explícitamente un objeto de una función constructora, this esencialmente se descartará y se usará el objeto devuelto en su lugar. Aquí, el objeto devuelto es la función, y el
this.name = "Agnus"line se asigna a un objeto al que nunca se vuelve a hacer referencia.
Por el contrario, cuando no usa new y la función a la que llama no es una propiedad de un objeto (o una función de enlace o flecha), this será el objeto global (en modo descuidado) o undefined ( en modo estricto). En modo descuidado,
function MyClass () { this.name = "Agnus"lo hace
window.name = "Agnus"; Y luego, cuando invoque la función devuelta más tarde con r() , dado que no es una propiedad de un objeto, this es el objeto global, cuyo name es Angus .
Para reducir la confusión, recomiendo
new al invocar un constructorNo tienes que hacerlo, pero si lo haces, te confundirás a ti mismo (ya otros lectores del código) menos.
El modo estricto también es una buena idea.