Dalam JavaScript, setiap objek pada saat yang sama adalah instance dan kelas. Untuk melakukan pewarisan, Anda dapat menggunakan instance objek apa pun sebagai prototipe.
Dalam Python, C ++, dll. Ada kelas, dan contoh, sebagai konsep yang terpisah. Untuk melakukan pewarisan, Anda harus menggunakan kelas dasar untuk membuat kelas baru, yang kemudian dapat digunakan untuk menghasilkan turunan turunan.
Mengapa JavaScript mengarah ke arah ini (orientasi objek berbasis prototipe)? apa keuntungan (dan kerugian) dari OO berbasis prototipe sehubungan dengan OO tradisional, berbasis kelas?
javascript
oop
inheritance
prototype-programming
Stefano Borini
sumber
sumber
GEB
?Jawaban:
Ada sekitar seratus masalah terminologi di sini, sebagian besar dibangun di sekitar seseorang (bukan Anda) mencoba untuk membuat ide mereka terdengar seperti The Best.
Semua bahasa berorientasi objek harus mampu menangani beberapa konsep:
Sekarang, sejauh perbandingan:
Hal pertama adalah seluruh pertanyaan "kelas" vs "prototipe". Ide awalnya dimulai di Simula, di mana dengan metode berbasis kelas setiap kelas mewakili satu set objek yang berbagi ruang keadaan yang sama (baca "nilai yang mungkin") dan operasi yang sama, sehingga membentuk kelas ekivalensi. Jika Anda melihat kembali Smalltalk, karena Anda dapat membuka kelas dan menambahkan metode, ini sama dengan apa yang dapat Anda lakukan di Javascript.
Kemudian bahasa OO ingin dapat menggunakan pemeriksaan tipe statis, jadi kami mendapat gagasan tentang kelas tetap yang ditetapkan pada waktu kompilasi. Dalam versi kelas terbuka, Anda memiliki lebih banyak fleksibilitas; di versi yang lebih baru, Anda memiliki kemampuan untuk memeriksa beberapa jenis kebenaran di kompiler yang seharusnya memerlukan pengujian.
Dalam bahasa "berbasis kelas", penyalinan itu terjadi pada waktu kompilasi. Dalam bahasa prototipe, operasi disimpan dalam struktur data prototipe, yang disalin dan dimodifikasi pada saat dijalankan. Namun secara abstrak, sebuah kelas masih merupakan kelas ekivalensi dari semua objek yang memiliki ruang dan metode yang sama. Saat Anda menambahkan metode ke prototipe, Anda secara efektif membuat elemen kelas kesetaraan baru.
Sekarang, mengapa melakukan itu? terutama karena itu membuat mekanisme yang sederhana, logis, elegan pada saat run time. sekarang, untuk membuat objek baru, atau untuk membuat kelas baru, Anda hanya perlu melakukan salinan yang dalam, menyalin semua data dan struktur data prototipe. Anda mendapatkan lebih banyak warisan dan polimorfisme secara gratis: pencarian metode selalu terdiri dari meminta kamus untuk penerapan metode dengan nama.
Alasan yang berakhir pada skrip Javascript / ECMA pada dasarnya adalah bahwa ketika kami memulai ini 10 tahun yang lalu, kami berhadapan dengan komputer yang kurang kuat dan browser yang kurang canggih. Memilih metode berbasis prototipe berarti penerjemah bisa sangat sederhana sambil mempertahankan sifat yang diinginkan dari orientasi objek.
sumber
Suatu perbandingan, yang sedikit bias terhadap pendekatan berbasis prototipe, dapat ditemukan dalam makalah Self: The Power of Simplicity . Makalah ini membuat argumen berikut yang mendukung prototipe:
Self mungkin adalah bahasa pertama yang mengimplementasikan prototipe (itu juga memelopori teknologi menarik lainnya seperti JIT, yang kemudian membuat jalan ke JVM), jadi membaca makalah Self lainnya juga harus instruktif.
sumber
point
adalah turunan dari kelasPoint
, yang merupakan turunan dari metaclassstandard-class
, yang merupakan turunan dari dirinya sendiri, ad finitum.Anda harus membaca buku hebat tentang JavaScript oleh Douglas Crockford . Ini memberikan penjelasan yang sangat baik tentang beberapa keputusan desain yang diambil oleh pembuat JavaScript.
Salah satu aspek desain penting dari JavaScript adalah sistem pewarisan prototipalnya. Objek adalah warga negara kelas pertama dalam JavaScript, sedemikian rupa sehingga fungsi reguler juga diimplementasikan sebagai objek (objek 'Fungsi' tepatnya). Menurut pendapat saya, ketika awalnya dirancang untuk berjalan di dalam browser, itu dimaksudkan untuk digunakan untuk membuat banyak objek tunggal. Di browser DOM, Anda menemukan jendela itu, mendokumentasikan dll semua objek tunggal. Selain itu, JavaScript adalah bahasa dinamis yang diketik secara longgar (tidak seperti Python yang diketik dengan kuat, bahasa dinamis), sebagai akibatnya, konsep ekstensi objek diimplementasikan melalui penggunaan properti 'prototipe'.
Jadi saya pikir ada beberapa pro untuk OO berbasis prototipe seperti yang diterapkan dalam JavaScript:
Berikut adalah beberapa kontra dari O prototypal:
sumber