Apakah mungkin untuk mensimulasikan kelas dasar abstrak dalam JavaScript? Apa cara paling elegan untuk melakukannya?
Katakan, saya ingin melakukan sesuatu seperti: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Ini harus menghasilkan: 'bark', 'meong'
javascript
oop
abstract
Sabya
sumber
sumber
Jawaban:
Salah satu cara sederhana untuk membuat kelas abstrak adalah ini:
The
Animal
"kelas" dansay
metode yang abstrak.Membuat sebuah instance akan menimbulkan kesalahan:
Beginilah cara Anda "mewarisi" darinya:
Dog
terlihat seperti itu.Dan beginilah skenario Anda:
Fiddle di sini (lihat keluaran konsol).
sumber
Kelas JavaScript dan Warisan (ES6)
Menurut ES6, Anda dapat menggunakan kelas JavaScript dan warisan untuk mencapai apa yang Anda butuhkan.
Referensi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Pertama-tama, kami mendefinisikan kelas abstrak kami. Kelas ini tidak dapat dibuat instance-nya, tetapi dapat diperpanjang. Kita juga bisa mendefinisikan fungsi yang harus diimplementasikan di semua kelas yang memperluas kelas ini.
Setelah itu, kita dapat membuat Kelas beton kita. Kelas-kelas ini akan mewarisi semua fungsi dan perilaku dari kelas abstrak.
Dan hasilnya ...
sumber
Apakah yang Anda maksud seperti ini:
sumber
whattosay
tidak ditentukan pada hewan ), dan bahwa jawaban ini dengan jelas menanyakan jika jawaban yang diajukan adalah apa yang dicari oleh penanya. Itu tidak mengklaim memberikan solusi untuk kelas abstrak dalam javascript. Penanya tidak repot-repot membalas saya atau orang lain jadi saya tidak tahu apakah itu berhasil untuknya. Saya minta maaf jika usulan jawaban anak berusia lima tahun untuk pertanyaan orang lain tidak berhasil untuk Anda.Anda mungkin ingin melihat Kelas Dasar Dean Edwards: http://dean.edwards.name/weblog/2006/03/base/
Atau, ada contoh / artikel oleh Douglas Crockford tentang pewarisan klasik di JavaScript: http://www.crockford.com/javascript/inheritance.html
sumber
Pasti. Ada sekitar seribu cara untuk mengimplementasikan sistem kelas / instance dalam JavaScript. Ini salah satunya:
Tentu saja itu bukan kelas dasar abstrak. Apakah yang Anda maksud seperti:
sumber
sumber
Ini tidak dijamin akan berfungsi sebagai
__proto__
bukan variabel standar, tetapi setidaknya berfungsi di Firefox dan Safari.Jika Anda tidak memahami cara kerjanya, baca tentang rantai prototipe.
sumber
setPrototypeOf
metode yang saya perlukan untuk kode saya.Anda dapat membuat kelas abstrak dengan menggunakan prototipe objek, contoh sederhananya adalah sebagai berikut:
Anda dapat mengubah metode di atas atau tidak, terserah Anda saat mengimplementasikannya. Untuk observasi yang lebih detail, Anda mungkin ingin berkunjung ke sini .
sumber
Pertanyaan cukup lama, tetapi saya membuat beberapa solusi yang mungkin bagaimana membuat "kelas" abstrak dan memblokir pembuatan objek jenis itu.
Seperti yang Anda lihat objek terakhir memberi kami kesalahan, itu karena Animal dalam prototipe memiliki properti
abstract
. Untuk memastikan itu Hewan bukan sesuatu yang adaAnimal.prototype
di rantai prototipe saya lakukan:Jadi saya periksa apakah objek prototipe terdekat saya memiliki
abstract
properti, hanya objek yang dibuat langsung dariAnimal
prototipe yang memiliki kondisi benar. FungsihasOwnProperty
hanya memeriksa properti dari objek saat ini bukan prototipe, jadi ini memberi kita 100% yakin bahwa properti dideklarasikan di sini bukan dalam rantai prototipe.Dalam proposisi saya, kami tidak harus berubah
constructor
setiap saatObject.create
seperti yang ada di jawaban terbaik saat ini oleh @ Jordão.Solusi juga memungkinkan untuk membuat banyak kelas abstrak dalam hierarki, kita hanya perlu membuat
abstract
properti dalam prototipe.sumber
Hal lain yang mungkin ingin Anda terapkan adalah memastikan kelas abstrak Anda tidak dibuat instance-nya. Anda dapat melakukannya dengan mendefinisikan fungsi yang bertindak sebagai FLAG yang disetel sebagai konstruktor kelas Abstrak. Ini kemudian akan mencoba untuk membangun FLAG yang akan memanggil konstruktornya yang berisi pengecualian untuk dilempar. Contoh di bawah ini:
sumber
Javascript dapat memiliki warisan, lihat URL di bawah ini:
http://www.webreference.com/js/column79/
Andrew
sumber
Kita bisa menggunakan
Factory
pola desain dalam kasus ini. Javascript digunakanprototype
untuk mewarisi anggota orang tua.Tentukan konstruktor kelas induk.
Dan kemudian membuat kelas anak-anak.
Kemudian tentukan konstruktor kelas anak.
Menguji.
Berikut tautan Codepen untuk pengkodean contoh lengkap.
sumber
sumber
Saya pikir Semua Jawaban itu khususnya dua jawaban pertama (oleh beberapa dan jordão ) menjawab pertanyaan dengan jelas dengan konsep dasar JS prototipe konvensional.
Sekarang karena Anda ingin konstruktor kelas hewan berperilaku sesuai dengan parameter yang diteruskan ke konstruksi, saya rasa ini sangat mirip dengan perilaku dasar
Creational Patterns
misalnya Pola Pabrik .Di sini saya membuat sedikit pendekatan untuk membuatnya berfungsi seperti itu.
sumber
Animal
Konstruktor ini dapat dilihat sebagai anti-pola, superclass seharusnya tidak memiliki pengetahuan tentang subclass. (melanggar prinsip Liskov dan Buka / Tutup)sumber
Jika Anda ingin memastikan bahwa kelas dasar Anda dan anggotanya benar-benar abstrak, berikut adalah kelas dasar yang melakukan ini untuk Anda:
Mode ketat tidak memungkinkan untuk mencatat pemanggil dalam metode throwAbstract tetapi kesalahan harus terjadi di lingkungan debug yang akan menampilkan pelacakan tumpukan.
sumber