Comportamiento extraño de Javascript `new` de` function` [duplicado]

Oct 15 2020

Me acabo de encontrar con algo que realmente me sorprende. Considere las siguientes cuatro funciones:

function A() {
 this.q = 1;
}

function B() {
 this.q = 1;
 return this;
}

function C() {
 this.q = 1;
 return 42;
}

function D() {
 this.q = 1;
 return {};
}

y creemos objetos (vía new) a partir de todos ellos:

console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());

Esta es la salida:

a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}

Los primeros tres parecen indicar que no importa lo que devuelva la función, que JS solo se preocupa por lo que hace cada función this(que era mi creencia anterior, por cierto). Pero el último contradice eso.

Entonces, ¿qué está pasando aquí? Mi regla revisada sería "si la función devuelve un Object, lo mantenemos. De lo contrario, lo mantenemos this". Pero me siento bastante inseguro al respecto.

Respuestas

1 Lorand Oct 16 2020 at 02:51

Cuando usa el operador nuevo , crea un objeto.

El valor de retorno es el esperado. Si en la devolución es un objeto, devolverá ese objeto; de lo contrario, si la devolución es una función, devolverá esa función.

function A(){
    this.b = 3;
    return function(){return 4;};
}
function B(){
    this.b = 3;
    return { d:4};
}

console.log(typeof (new A())); //function
console.log(typeof (new B())); //object {d:4}

Si cualquier otro valor o no existe en la devolución, este operador tendrá prioridad devuelto como un objeto.

function C(){
    this.b = 3;
    return "78";
}
console.log(typeof (new C())); // object {b:3}
3 Harkal Oct 16 2020 at 02:40

en JavaScript cuando invoca una función sin new test(), ya que simplemente ejecuta la función y la. devuelve lo que sea devuelto por la función

mientras que cuando invoca una función con new like new test(), espera que la declaración return devuelva un objeto, else return thisobject.

entonces

function test() {
    this.q = 1
}

test(); // return undefined

new test(); // return {q:1}