Di PHP / Java seseorang dapat melakukan:
class Sub extends Base
{
}
Dan secara otomatis semua metode publik / dilindungi, properti, bidang, dll dari kelas Super menjadi bagian dari Sub kelas yang dapat diganti jika perlu.
Apa yang setara dengan itu di Javascript?
javascript
oop
Klik Suka
sumber
sumber
Jawaban:
Saya telah mengubah cara saya melakukan ini sekarang, saya mencoba menghindari penggunaan fungsi konstruktor dan
prototype
propertinya, tetapi jawaban lama saya dari tahun 2010 masih ada di bagian bawah. Saya sekarang lebih sukaObject.create()
.Object.create
tersedia di semua browser modern.Saya harus mencatat bahwa
Object.create
biasanya jauh lebih lambat daripada menggunakannew
dengan konstruktor fungsi.jsfiddle.dll
Salah satu manfaat besar menggunakan Object.create adalah dapat meneruskan argumen defineProperties , yang memberi Anda kontrol signifikan atas bagaimana properti di kelas dapat diakses dan dihitung, dan saya juga menggunakan fungsi untuk membuat instance, ini berfungsi sebagai konstruktor dengan cara, karena Anda bisa melakukan inisialisasi di akhir, bukan hanya mengembalikan instance.
jsfiddle.dll
Ini adalah jawaban asli saya dari tahun 2010:
sumber
alert()
untuk melihatinstance.showColor()
pengembalian apa yang masih saya dapatkanundefined
. jsbin.com/uqalin/1Di JavaScript Anda tidak memiliki kelas tetapi Anda bisa mendapatkan warisan dan perilaku yang digunakan kembali dalam banyak cara:
Warisan pseudo-klasik (melalui pembuatan prototipe):
Harus digunakan dengan
new
operator:Aplikasi fungsi atau "rangkaian konstruktor":
Pendekatan ini juga harus digunakan dengan
new
operator:Perbedaannya dengan contoh pertama adalah ketika kita
apply
menjadiSuper
konstruktor kethis
objek di dalamnyaSub
, ia menambahkan properti yang ditugaskan kethis
onSuper
, langsung pada instance baru, misalnyasubInstance
berisi propertimember1
danmember2
langsung (subInstance.hasOwnProperty('member1') == true;
).Dalam contoh pertama, properti tersebut dicapai melalui rantai prototipe , mereka ada di
[[Prototype]]
objek internal .Warisan parasit atau Pembangun Daya:
Pendekatan ini pada dasarnya didasarkan pada "penambahan objek", Anda tidak perlu menggunakan
new
operator, dan seperti yang Anda lihat,this
kata kunci tidak terlibat.ECMAScript Edisi ke-5.
Object.create
metode:Metode di atas adalah teknik pewarisan prototipe yang diusulkan oleh Crockford .
Contoh objek mewarisi dari contoh objek lain, itu saja.
Teknik ini bisa lebih baik daripada sederhana "objek augmentation" karena sifat diwariskan tidak disalin semua contoh objek baru, karena dasar objek ditetapkan sebagai
[[Prototype]]
dari diperpanjang objek, dalam contoh di atassubInstance
mengandung fisik hanyamember3
properti.sumber
Object.create()
atauclone()
fungsi kustom (misalnya mercurial.intuxication.org/hg/js-hacks/raw-file/tip/clone.js ) untuk mewarisi langsung dari objek prototipe; lihat komentar ke stackoverflow.com/questions/1404559/… untuk penjelasannyaObject.create
metode ini :)member1
variabel yang sama , yang tidak diinginkan sama sekali. Tentu saja mereka bisa menulis ulang, tapi itu tidak masuk akal. github.com/dotnetwise/Javascript-FastClass adalah solusi gula yang lebih baik.Sub.prototype = new Super();
. Bagaimana jika kedua kelas tidak akan pernah digunakan selama eksekusi skrip? Sepertinya masalah kinerja. Mengapa saya perlu membuat kelas induk jika kelas anak tidak benar-benar digunakan? Bisakah Anda menjelaskan lebih lanjut? Berikut demonstrasi sederhana dari masalah ini: jsfiddle.net/slavafomin/ZeVL2 Terima kasih!Bagi mereka yang mencapai halaman ini pada 2019 atau setelahnya
Dengan versi standar ECMAScript (ES6) terbaru , Anda dapat menggunakan kata kunci
class
.Perhatikan bahwa definisi kelas bukanlah regular
object
; karenanya tidak ada koma di antara anggota kelas. Untuk membuat instance kelas, Anda harus menggunakannew
kata kunci. Untuk mewarisi dari kelas dasar, gunakanextends
:Untuk mewarisi dari kelas dasar, gunakan
extends
:Dari kelas turunan, Anda dapat menggunakan super dari konstruktor atau metode apa pun untuk mengakses kelas dasarnya:
super().
super.getName()
,.Ada lebih banyak hal menggunakan kelas. Jika Anda ingin menggali lebih dalam tentang subjek ini, saya merekomendasikan “ Classes in ECMAScript 6 ” oleh Dr. Axel Rauschmayer. *
sumber
sumber
class
danextends
gula sintaks (sangat berguna) untuk rantai prototipe: stackoverflow.com/a/23877420/895245Nah, di JavaScript tidak ada "class inheritance", yang ada hanya "prototype inheritance". Jadi Anda tidak membuat kelas "truk" dan kemudian menandainya sebagai subkelas dari "mobil". Sebaliknya, Anda membuat objek "Jack" dan mengatakan bahwa objek tersebut menggunakan "John" sebagai prototipe. Jika John tahu, berapa "4 + 4" itu, maka Jack juga mengetahuinya.
Saya sarankan Anda membaca artikel Douglas Crockford tentang warisan prototipe di sini: http://javascript.crockford.com/prototypal.html Dia juga menunjukkan bagaimana Anda dapat membuat JavaScript memiliki warisan "serupa" seperti dalam bahasa OO lainnya dan kemudian menjelaskan bahwa ini sebenarnya berarti memecah javaScript dengan cara yang tidak dimaksudkan untuk digunakan.
sumber
Saya menemukan kutipan ini sebagai yang paling mencerahkan:
Saya lebih suka menggunakan konstruktor daripada objek, jadi saya lebih memilih metode "warisan klasik semu" yang dijelaskan di sini oleh CMS . Berikut adalah contoh beberapa pewarisan dengan rantai prototipe :
Ini adalah sumber bagus lainnya dari MDN , dan ini adalah jsfiddle sehingga Anda dapat mencobanya .
sumber
Pewarisan Javascript sedikit berbeda dari Java dan PHP, karena tidak benar-benar memiliki kelas. Sebaliknya ia memiliki objek prototipe yang menyediakan metode dan variabel anggota. Anda dapat merangkai prototipe tersebut untuk memberikan warisan objek. Pola paling umum yang saya temukan saat meneliti pertanyaan ini dijelaskan di Jaringan Pengembang Mozilla . Saya telah memperbarui contoh mereka untuk menyertakan panggilan ke metode superclass dan untuk menampilkan log dalam pesan peringatan:
Secara pribadi, saya menemukan warisan dalam Javascript canggung, tetapi ini adalah versi terbaik yang saya temukan.
sumber
Anda tidak bisa (dalam pengertian klasik). Javascript adalah bahasa prototipe. Anda akan melihat bahwa Anda tidak pernah mendeklarasikan sebuah "class" dalam Javascript; Anda hanya mendefinisikan status dan metode suatu objek. Untuk menghasilkan warisan, Anda mengambil beberapa objek dan membuat prototipe. Prototipe diperluas dengan fungsionalitas baru.
sumber
Kamu bisa memakai
.inheritWith
dan.fastClass
perpustakaan . Ini lebih cepat dari kebanyakan pustaka populer dan terkadang bahkan lebih cepat dari versi aslinya.Sangat mudah digunakan:
Pemakaian
sumber
sumber
Setelah membaca banyak posting, saya menemukan solusi ini ( jsfiddle di sini ). Seringkali saya tidak membutuhkan sesuatu yang lebih canggih
sumber
Berkat jawaban CMS dan setelah mengotak-atik beberapa saat dengan prototipe dan Object.create dan yang tidak, saya dapat menemukan solusi yang rapi untuk warisan saya menggunakan apply seperti yang ditunjukkan di sini:
sumber
Dari ES2015, begitulah cara Anda melakukan pewarisan di JavaScript
sumber
sumber
Kelas ES6:
Javascript tidak memiliki kelas. Kelas dalam javascript hanyalah gula sintaksis yang dibangun di atas pola pewarisan prototipe javascript. Anda dapat menggunakan JS
class
untuk menerapkan pewarisan prototipe tetapi penting untuk disadari bahwa Anda sebenarnya masih menggunakan fungsi konstruktor.Konsep-konsep ini juga berlaku ketika Anda memperluas dari a
es6
'kelas' menggunakan kata kunci extends. Ini hanya membuat tautan tambahan dalam rantai prototipe. Itu__proto__
Contoh:
Object.create ()
Object.create()
juga merupakan cara untuk membuat warisan di JS dalam javascript.Object.create()
adalah fungsi yang membuat objek baru, mengambil objek yang sudah ada sebagai argumen. Ini akan menetapkan objek yang diterima sebagai argumen ke__proto__
properti objek yang baru dibuat. Sekali lagi, penting untuk menyadari bahwa kita terikat pada paradigma pewarisan prototipe yang diwujudkan JS.Contoh:
sumber
Anda tidak dapat mewarisi dari kelas di JavaScript, karena tidak ada kelas di JavaScript.
sumber