Strano comportamento di Javascript `new` da` function` [duplicato]
Mi sono appena imbattuto in qualcosa che mi sorprende davvero. Considera le seguenti quattro funzioni:
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 {};
}
e creiamo oggetti (tramite new) da tutti loro:
console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());
Questo è l'output:
a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}
I primi tre sembrano indicare che non importa cosa restituisce la funzione, che JS si preoccupa solo di ciò che fa ogni funzione this(che era la mia precedente convinzione, btw). Ma l'ultimo lo contraddice.
Allora, cosa sta succedendo qui? La mia regola rivista sarebbe "se la funzione restituisce un Object, lo manteniamo. Altrimenti, lo conserviamo this". Ma non mi sento abbastanza sicuro al riguardo.
Risposte
Quando usi il nuovo operatore, crea un oggetto.
Il valore restituito è quello previsto. Se nel ritorno è un oggetto restituirà quell'oggetto altrimenti se nel ritorno è una funzione restituirà quella funzione.
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}
Se qualsiasi altro valore o inesistente nella restituzione, questo operatore avrà la precedenza restituito come oggetto.
function C(){
this.b = 3;
return "78";
}
console.log(typeof (new C())); // object {b:3}
in JavaScript quando si richiama una funzione senza new come test()se fosse semplicemente eseguita la funzione e essa. restituisce tutto ciò che viene restituito dalla funzione
mentre quando si richiama una funzione con new come new test()si aspetta che l'istruzione return restituisca un oggetto, altrimenti restituisce l' thisoggetto.
così
function test() {
this.q = 1
}
test(); // return undefined
new test(); // return {q:1}