Latar belakang cepat: Dalam JavaScript, fungsi konstruktor untuk setiap jenis objek memiliki prototype
properti. The prototype
mengacu pada sebuah objek yang masing-masing dibangun menggunakan objek sebagai langkah berikutnya dalam rantai prototipe. Saat Anda ingin satu tipe melekat dari tipe lain, Anda bisa mengatur prototype
tipe anak ke instance baru dari tipe induk.
Sebagai contoh:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
Pertanyaan saya bertanya tentang kode apa yang harus ada di tempat " Some prototype object goes here
" di kode di atas. Naluri pertama saya adalah membuat turunan dari induknya (yaitu, new Parent()
), tetapi dalam komentar untuk jawaban pada Apakah ini cara yang aman untuk menyalin satu objek prototipe ke yang lain? , satu pengguna menulis:
Tidak, jangan gunakan
new bar()
untuk objek prototipe!
(... yang merupakan pendapat yang telah saya lihat di banyak jawaban dan komentar SO, tetapi ini adalah satu-satunya contoh yang saya miliki saat ini.)
Opsi lainnya adalah menggunakan Object.create(Parent.prototype)
sebagai Child.prototype
. Sejauh yang saya tahu, ini juga menciptakan Parent
contoh baru , tetapi tidak menjalankan Parent
konstruktor.
Adakah yang bisa menjelaskan mengapa menjalankan fungsi konstruktor harus dihindari ketika membuat objek prototipe dari tipe induk? Apakah ada beberapa masalah teknis signifikan yang muncul (mungkin dengan berbagai tingkat warisan)? Atau apakah pola seperti itu merupakan penyalahgunaan konstruktor yang bertentangan dengan beberapa praktik terbaik prototipikal (misalnya, menjalankan konstruktor saat membuat prototipe melanggar beberapa pemisahan perhatian)?
sumber
Object.create
diterapkannya.Object.create
tidak berfungsi di IE8" - yang merupakan komentar tidak berguna ketika Anda dapat mengimplementasikannya untuk use case ini dalam 2 detik pada browser apa pun.Sekarang setelah pemahaman saya sedikit melebar, saya ingin membangun jawaban Esailija dengan contoh spesifik:
Satu perhatian khusus adalah bahwa konstruktor dapat mengatur properti spesifik-instance. Dengan demikian, jika Anda menggunakan objek prototipe yang dibuat dengan
new
, semua instance anak Anda dapat berbagi properti instans-spesifik tunggal yang ditentukan konstruktor dari prototipe.Misalnya,
Parent
setiap instance memilikiid
properti unik yang ditetapkan sebagai waktu konstruksi:Ini akan menyebabkan semua
Child
instance membagikanid
properti prototipe tunggal yang diwarisi dari objek satu-satunya yangnew Parent()
digunakanChild.prototype
.Pendekatan yang lebih baik untuk kasus ini adalah dengan menggunakan
Object.create
dan langsung memanggil konstruktor induk (jika perlu) di dalam konstruktor anak:sumber