"Function" [yinelenen] Javascript "new" in garip davranışı
Beni gerçekten şaşırtan bir şeyle karşılaştım. Aşağıdaki dört işlevi göz önünde bulundurun:
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 {};
}
ve newhepsinden nesneler (aracılığıyla ) oluşturalım :
console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());
Çıktı şu:
a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}
İlk üçü, işlevin ne döndürdüğünün önemli olmadığını, JS'nin yalnızca her işlevin ne yaptığını önemsediğini gösteriyor gibi görünüyor this(önceki inancım, btw). Ama sonuncusu bununla çelişiyor.
Peki burada ne oluyor? Benim revize edilmiş kuralım "eğer fonksiyon bir döndürürse Object, bunu saklarız. Aksi takdirde saklarız this" olacaktır. Ama bundan oldukça emin değilim.
Yanıtlar
Yeni operatörü kullandığınızda, bir nesne oluşturur.
Dönüş değeri beklendiği gibidir. Eğer dönüşte o bir nesne ise o nesneyi döndürür, aksi takdirde dönüş bir fonksiyonsa o fonksiyonu döndürür.
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}
Eğer dönüşte başka bir değer yoksa veya yoksa, bu operatör nesne olarak döndürülen önceliği alacaktır.
function C(){
this.b = 3;
return "78";
}
console.log(typeof (new C())); // object {b:3}
JavaScript'te yeni olmayan bir işlevi çağırdığınızda, test()sadece işlevi çalıştırdığı gibi. işlev tarafından döndürülen şeyi döndürür
new like ile bir işlevi çağırdığınızda new test(), return ifadesinin başka bir nesne döndürmesini bekler this.
yani
function test() {
this.q = 1
}
test(); // return undefined
new test(); // return {q:1}