Seltsames Verhalten von Javascript `new` von` function` [duplicate]
Ich bin gerade auf etwas gestoßen, das mich wirklich überrascht. Betrachten Sie die folgenden vier Funktionen:
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 {};
}
und lassen Sie uns Objekte (via new) aus allen erstellen :
console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());
Dies ist die Ausgabe:
a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}
Die ersten drei scheinen darauf hinzudeuten, dass es keine Rolle spielt, was die Funktion zurückgibt, dass JS sich nur darum kümmert, was jede Funktion macht this(was übrigens meine vorherige Überzeugung war). Aber der letzte widerspricht dem.
Also, was ist hier los? Meine überarbeitete Regel wäre "Wenn die Funktion ein zurückgibt Object, behalten wir das. Andernfalls behalten wir this". Aber ich bin mir ziemlich unsicher.
Antworten
Wenn Sie den neuen Operator verwenden, wird ein Objekt erstellt.
Der Rückgabewert ist wie erwartet. Wenn es sich bei der Rückgabe um ein Objekt handelt, wird dieses Objekt zurückgegeben. Wenn es sich bei der Rückgabe um eine Funktion handelt, wird diese Funktion zurückgegeben.
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}
Wenn in der Rückgabe ein anderer Wert vorhanden oder nicht vorhanden ist, hat dieser Operator Vorrang, der als Objekt zurückgegeben wird.
function C(){
this.b = 3;
return "78";
}
console.log(typeof (new C())); // object {b:3}
in JavaScript, wenn Sie eine Funktion ohne neue aufrufen, wie test()es nur die Funktion und es ausführt. Gibt alles zurück, was von der Funktion zurückgegeben wird
Wenn Sie eine Funktion mit new aufrufen new test(), wird erwartet, dass die return-Anweisung ein Objekt zurückgibt, andernfalls ein return- thisObjekt.
damit
function test() {
this.q = 1
}
test(); // return undefined
new test(); // return {q:1}