Konstruktor dalam JavaScript juga berbeda dari bahasa lain. Fungsi apa pun yang dipanggil melalui kata kunci baru dapat dianggap sebagai konstruktor.
Di dalam badan konstruktor, ini menunjuk pada objek yang baru dibuat. Jika tidak ada ekspresi pengembalian yang ditampilkan di badan konstruktor, maka kita akan mengembalikan ini secara default, yaitu, objek yang baru dibuat.
Salinan kode adalah sebagai berikut:
fungsi foo () {
this.bla = 1;
}
Foo.prototype.test = function () {
console.log (this.bla);
};
var test = foo baru ();
Kode di atas memanggil FOO sebagai konstruktor dan menunjuk prototipe objek yang baru dibuat (__proto__) ke foo.prototype.
Jika kita mendefinisikan ekspresi yang dikembalikan dalam konstruktor, konstruktor akan mengembalikan seluruh ekspresi, tetapi ekspresi pengembalian ini harus menjadi objek.
Salinan kode adalah sebagai berikut:
function bar () {
kembali 2;
}
bar baru (); // objek baru
function test () {
this.value = 2;
kembali {
foo: 1
};
}
tes baru (); // objek yang dikembalikan
Jika baru dihilangkan, fungsi tidak dapat mengembalikan objek baru.
Salinan kode adalah sebagai berikut:
fungsi foo () {
this.bla = 1; // diatur pada objek global
}
Foo (); // belum diartikan
Contoh di atas juga dapat bekerja dalam beberapa skenario, tetapi karena mekanisme kerja ini di JavaScript, ini akan menunjuk ke objek global di sini.
Model pabrik
Agar dapat menggunakan kata kunci baru, konstruktor harus menampilkan nilai pengembalian.
Salinan kode adalah sebagai berikut:
function bar () {
nilai var = 1;
kembali {
Metode: function () {
nilai pengembalian;
}
}
}
Bar.prototype = {
foo: function () {}
};
bar baru ();
Batang();
Dalam contoh di atas, efek memanggil bilah fungsi tanpa menggunakan yang baru adalah sama, dan objek yang baru dibuat yang berisi metode metode akan dikembalikan, yang sebenarnya merupakan penutupan.
Satu hal yang perlu diperhatikan di sini adalah bahwa bilah baru () tidak akan mengembalikan bilah. Prototype, tetapi sebaliknya akan menjadi objek prototipe dari metode fungsi di dalam ekspresi pengembalian.
Dalam contoh di atas, tidak ada perbedaan fungsionalitas antara menggunakan yang baru atau tidak.
Buat objek baru melalui mode pabrik
Kami sering diingatkan untuk tidak menggunakan yang baru karena begitu Anda lupa tentang penggunaannya akan menyebabkan kesalahan.
Untuk membuat objek, kami lebih suka menggunakan pola pabrik dan membangun objek baru dalam pola pabrik.
Salinan kode adalah sebagai berikut:
fungsi foo () {
var obj = {};
obj.value = 'blub';
var private = 2;
obj.somemethod = function (value) {
this.value = nilai;
}
obj.getprivate = function () {
kembali pribadi;
}
kembalikan obj;
}
Meskipun kode contoh di atas kurang rentan terhadap kesalahan daripada saat menggunakan yang baru dan akan lebih nyaman saat menggunakan variabel pribadi, ada beberapa kelemahan:
Karena objek prototipe tidak dapat dibagikan, lebih banyak memori diperlukan.
Untuk mencapai warisan, pola pabrik memerlukan menyalin semua metode objek lain atau menggunakannya sebagai prototipe objek baru.
Menyerahkan rantai prototipe hanya untuk menghindari penggunaan yang baru, yang tampaknya bertentangan dengan semangat bahasa JavaScript.
Meringkaskan
Meskipun menggunakan yang baru mungkin lebih rentan terhadap kesalahan, ini bukan alasan untuk meninggalkan penggunaan rantai prototipe. Adapun metode mana yang akan diambil pada akhirnya, itu tergantung pada kebutuhan aplikasi. Cara terbaik adalah memilih gaya dan menempel padanya.
Sederhananya, konstruktor adalah menginisialisasi objek instan, dan properti prototipe objek mewarisi objek instan.