"Function" [yinelenen] Javascript "new" in garip davranışı

Oct 15 2020

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

1 Lorand Oct 16 2020 at 02:51

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}
3 Harkal Oct 16 2020 at 02:40

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}