Dalam JavaScript, apa perbedaan antara kedua contoh ini:
Prasyarat:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
Contoh pewarisan A menggunakan Object.create:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
Contoh pewarisan B menggunakan kata kunci baru
function MyClass(){
}
MyClass.prototype = new SomeBaseClass();
Kedua contoh tersebut tampaknya melakukan hal yang sama. Kapan Anda akan memilih salah satu dari yang lain?
Pertanyaan tambahan: Pertimbangkan kode di tautan di bawah (baris 15), di mana referensi ke konstruktor fungsi itu sendiri disimpan dalam prototipe. Mengapa ini berguna?
https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js
Kutipan (jika Anda tidak ingin membuka tautan):
THREE.ImageLoader.prototype = {
constructor: THREE.ImageLoader
}
javascript
inheritance
object-create
ChrisRich
sumber
sumber
Object.create
. Ini adalah kesalahan, dan harus dibuka kembali.Jawaban:
Dalam pertanyaan Anda, Anda telah menyebutkan bahwa
Both examples seem to do the same thing
, Itu tidak benar sama sekali, karenaContoh pertama Anda
Dalam contoh ini, Anda hanya mewarisi
SomeBaseClass' prototype
tetapi bagaimana jika Anda memiliki properti yang AndaSomeBaseClass
sukaidan jika Anda menggunakannya seperti
The
obj
objek tidak akan memilikipublicProperty
properti seperti dalam contoh ini .Contoh kedua Anda
Ini menjalankan
constructor
fungsi, membuat instance dariSomeBaseClass
dan mewarisi seluruhSomeBaseClass
objek. Jadi, jika Anda menggunakanDalam hal ini
publicProperty
propertinya juga tersedia untukobj
objek seperti dalam contoh ini .Karena
Object.create
tidak tersedia di beberapa browser lama, dalam hal ini Anda dapat menggunakanKode di atas hanya menambahkan
Object.create
fungsi jika tidak tersedia sehingga Anda dapat menggunakanObject.create
fungsi dan saya pikir kode di atas menjelaskan apa yangObject.create
sebenarnya dilakukan. Semoga ini bisa membantu.sumber
SomeBaseClass
.Itu benar dalam kasus Anda.
Ketika
SomeBaseClass
memiliki tubuh fungsi, ini akan dieksekusi dengannew
kata kunci. Ini biasanya tidak dimaksudkan - Anda hanya ingin menyiapkan rantai prototipe. Dalam beberapa kasus, bahkan dapat menyebabkan masalah serius karena Anda benar-benar membuat instance objek, yang variabel cakupan pribadinya dibagikan oleh semuaMyClass
instance karena mereka mewarisi metode istimewa yang sama. Efek samping lain bisa dibayangkan.Jadi, biasanya Anda lebih suka
Object.create
. Namun, ini tidak didukung di beberapa browser lama; yang merupakan alasan Anda melihatnew
-pendekatan terlalu sering karena sering tidak membahayakan (jelas). Lihat juga jawaban ini .sumber
Perbedaannya menjadi jelas jika Anda menggunakan
Object.create()
sebagaimana mestinya. Sebenarnya, itu sepenuhnya menyembunyikanprototype
kata dari kode Anda, itu akan melakukan pekerjaan di bawah tenda. MenggunakanObject.create()
, kita bisa pergi sepertiDan kemudian kita dapat memperluas / mewarisi objek lain dari ini
Jadi ini adalah konsep lain, cara pewarisan yang lebih "berorientasi objek". Tidak ada "fungsi konstruktor" di luar kotak menggunakan
Object.create()
misalnya. Tapi tentu saja Anda bisa membuat dan memanggil fungsi konstruktor yang ditentukan sendiri di dalam objek tersebut.Salah satu argumen untuk digunakan
Object.create()
adalah bahwa mungkin terlihat lebih alami untuk mencampur / * mewarisi * dari objek lain, daripada menggunakan cara default Javascripts .sumber
Object.create
tidak dapat benar-benar menggantikan pendekatan klasik dengannew
saat fungsi konstruktor diperlukanObject.create
tidak memanggil fungsi yang akan diperlukan untuk membuat penutupan. Tentu saja, denganObject.create
Anda dapat meletakkaninit
metode pada objek Anda dan memanggilnya segera dan bahkan mungkin kembalithis
sehingga Anda mendapatkan sintaks yang ringkas - tapi tunggu, itu adalah konstruktor.new
menggunakan "object linkage", jadi tidak banyak perbedaan. Faktanya, hanya ada dua hal:.constructor
dipanggil.init
, dan fungsi itu tidak memiliki.prototype
properti yang menunjuk kembali ke objek prototipe Anda. Sisanya hanya sintaks - dan saya lebih memilihnew X
lebihObject.create(x).init()
.Saya bukan ahli dalam java script tapi berikut adalah contoh sederhana untuk memahami perbedaan antara "Object.create" dan "new" ..
langkah 1: buat fungsi induk dengan beberapa properti dan tindakan ..
langkah 2: buat fungsi anak (PersonSalary) yang meluas di atas fungsi Person menggunakan kata kunci baru ..
langkah 3: buat fungsi anak kedua (PersonLeaves) yang meluas di atas fungsi Person menggunakan kata kunci Object.create ..
// Sekarang periksa kedua prototipe fungsi anak.
kedua fungsi anak ini akan ditautkan ke prototipe Person (fungsi induk) dan dapat mengakses metodenya tetapi jika Anda membuat fungsi anak menggunakan new itu akan mengembalikan objek baru dengan semua properti induk yang tidak kita perlukan dan juga saat Anda membuatnya objek atau fungsi menggunakan "New" sehingga fungsi induk dijalankan yang tidak kita inginkan.
Berikut adalah kesimpulannya
sumber