Perilaku aneh Javascript `new` dari` function` [duplikat]
Saya baru saja mengalami sesuatu yang sangat mengejutkan saya. Pertimbangkan empat fungsi berikut:
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 {};
}
dan mari buat objek (melalui new) dari semuanya:
console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());
Ini adalah keluarannya:
a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}
Tiga yang pertama tampaknya menunjukkan bahwa tidak masalah apa fungsi mengembalikan, bahwa JS hanya peduli tentang apa yang dilakukan setiap fungsi this(yang saya yakini sebelumnya, btw). Tapi yang terakhir membantahnya.
Jadi, apa yang terjadi disini? Aturan saya yang direvisi akan menjadi "jika fungsi mengembalikan Object, kami menyimpannya. Jika tidak, kami simpan this". Tapi saya merasa tidak yakin tentang itu.
Jawaban
Saat Anda menggunakan operator baru, ini membuat objek.
Nilai kembali seperti yang diharapkan. Jika di kembalikan itu adalah sebuah objek akan mengembalikan objek itu sebaliknya jika mengembalikan itu adalah fungsi akan mengembalikan fungsi itu.
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}
Jika ada nilai lain atau tidak ada yang dikembalikan, operator ini akan didahulukan sebagai objek.
function C(){
this.b = 3;
return "78";
}
console.log(typeof (new C())); // object {b:3}
di JavaScript ketika Anda memanggil fungsi tanpa new like test()itu hanya menjalankan fungsi dan itu. mengembalikan apa pun yang dikembalikan oleh fungsi
sedangkan ketika Anda memanggil sebuah fungsi dengan new like, new test()ia mengharapkan pernyataan return mengembalikan objek lain mengembalikan thisobjek.
begitu
function test() {
this.q = 1
}
test(); // return undefined
new test(); // return {q:1}