Bisakah kelas / objek JavaScript memiliki konstruktor? Bagaimana mereka diciptakan?
javascript
oop
Klik Upvote
sumber
sumber
Jawaban:
Menggunakan prototipe:
Menyembunyikan "warna" (agak menyerupai variabel anggota pribadi):
Pemakaian:
sumber
color
. Saya sarankan yang Anda gunakan sebagian besar ke preferensi pribadi (perlindungan vs kesederhanaan)var
membuat variabel pribadi.this
membuat variabel publikFoo
, sedangkan dalam kasus terakhir ia akan tahu bahwa ituFoo
dipanggil. Sangat membantu untuk debugging.Inilah templat yang terkadang saya gunakan untuk perilaku serupa OOP di JavaScript. Seperti yang Anda lihat, Anda dapat mensimulasikan anggota pribadi (baik statis maupun instan) menggunakan penutupan. Apa yang
new MyClass()
akan kembali adalah objek dengan hanya properti yang ditetapkan kethis
objek dan diprototype
objek "kelas."Saya telah ditanya tentang pewarisan menggunakan pola ini, jadi begini:
Dan contoh untuk menggunakan semuanya:
Seperti yang Anda lihat, kelas-kelas saling berinteraksi dengan benar (mereka berbagi id statis dari
MyClass
,announce
metode menggunakan metode yang benarget_name
, dll.)Satu hal yang perlu diperhatikan adalah perlunya membayangi properti instance. Anda benar-benar dapat membuat
inherit
fungsi melalui semua properti instance (menggunakanhasOwnProperty
) yang merupakan fungsi, dan secara otomatis menambahkansuper_<method name>
properti. Ini akan memungkinkan Anda memanggilthis.super_get_name()
alih-alih menyimpannya dalam nilai sementara dan menyebutnya terikat menggunakancall
.Untuk metode pada prototipe Anda tidak perlu khawatir tentang hal di atas, jika Anda ingin mengakses metode prototipe kelas super, Anda bisa menelepon
this.constructor.super.prototype.methodName
. Jika Anda ingin membuatnya kurang verbose Anda tentu saja dapat menambahkan properti kenyamanan. :)sumber
cls.prototype
bagian: "dibagikan di seluruh instance" hanya untuk membaca nilai (panggilanannounce
). Jika Anda menetapkanmyClassInstance.announce
ke nilai lain, itu membuat properti baru dimyClassInstance
, jadi itu hanya berlaku untuk objek itu, bukan contoh lain dari kelas. Menugaskan untukMyClass.prototype.announce
akan mempengaruhi semua instance.MyClass.get_nextId()
Menurut saya sebagian besar dari Anda memberikan contoh getter dan setter bukan konstruktor, yaitu http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
makan siang-dan lebih dekat tetapi contohnya tidak bekerja di jsFiddle.
Contoh ini membuat fungsi konstruktor pribadi yang hanya berjalan selama pembuatan objek.
Jika Anda ingin menetapkan properti publik maka konstruktor dapat didefinisikan sebagai berikut:
sumber
Box()
berfungsi :). Tetapi contoh ini serta contoh dalam jawaban lain dapat dengan mudah diperluas untuk menerima parameter.Box
fungsi dan Anda baik untuk pergi (itu masih "pribadi"). "Pribadi" dalam Javascript berarti dapat diakses melalui ruang lingkup leksikal; tidak perlu menugaskan anggota. Selain itu: kode ini salah. Ini menciptakan__construct
variabel global , yang sangat buruk.var
harus digunakan untuk membatasi ruang lingkup__construct
.Inti dari properti konstruktor adalah untuk menyediakan beberapa cara berpura-pura JavaScript memiliki kelas. Salah satu hal yang tidak bisa Anda lakukan adalah mengubah konstruktor objek setelah objek dibuat. Ini rumit.
Saya menulis karya yang cukup komprehensif beberapa tahun yang lalu: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
sumber
Contoh di sini: http://jsfiddle.net/FZ5nC/
Coba templat ini:
Anda harus menyesuaikan namespace Anda jika Anda mendefinisikan kelas statis:
Kelas contoh:
Instansiasi contoh:
Fungsi pemberitahuan didefinisikan sebagai AB = fungsi A_B (). Ini untuk membuat skrip Anda lebih mudah di-debug. Buka panel Elemen Inspeksi Chrome, jalankan skrip ini, dan perluas kembali jejak debug:
sumber
Ini adalah konstruktor:
Saat kamu melakukan
MyClass
dieksekusi, dan objek baru dikembalikan dari kelas itu.sumber
alert(valuePassedInAsArgument);
dan ini akan berjalan sekali untuk setiap instance, sehingga seluruh kelas adalah konstruktor itu sendiri.new object is returned of that class
- Bukankah lebih seperti objek baru yang dikembalikan dari fungsi itu?Saya menemukan tutorial ini sangat berguna. Pendekatan ini digunakan oleh sebagian besar plug-in jQuery.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Sekarang ,
sumber
klass
Pola ini sangat membantu saya. Dengan pola ini, Anda membuat kelas dalam file terpisah, memuatnya ke dalam aplikasi keseluruhan "sesuai kebutuhan".
sumber
var
di konstruktor (atau argumen fungsi, atau dalam fungsi seperti konstruktor).Ya, Anda bisa mendefinisikan konstruktor di dalam deklarasi kelas seperti ini:
sumber
Saya kira saya akan memposting apa yang saya lakukan dengan penutupan javascript karena belum ada yang menggunakan penutupan.
Terima kasih dan saran untuk solusi ini. :)
sumber
Menggunakan sampel Nick di atas, Anda dapat membuat konstruktor untuk objek tanpa parameter menggunakan pernyataan kembali sebagai pernyataan terakhir dalam definisi objek Anda. Kembalikan fungsi konstruktor Anda seperti di bawah ini dan itu akan menjalankan kode dalam __construct setiap kali Anda membuat objek:
sumber
this.getColor();
pada baris di atasalert("Object Created.");
tidak ada yang akan diperingatkan. Akan ada kesalahan seperti "getColor tidak didefinisikan". Jika Anda ingin konstruk dapat memanggil metode lain di objek itu perlu didefinisikan setelah semua metode lain. Jadi alih-alih memanggil__construct();
baris terakhir, tentukan konstruk di sana dan letakkan()
setelahnya untuk memaksanya mengeksekusi otomatis.()
ke akhir definisi konstruksi __ masih menghasilkan kesalahan. Saya harus menelepon__construct();
sendiri seperti pada kode asli untuk menghindari kesalahan.Mungkin sedikit lebih sederhana, tapi di bawah ini yang saya buat sekarang di 2017:
Dalam menggunakan kelas di atas, saya memiliki yang berikut:
Seperti yang Anda lihat, konstruktor mengambil dua parameter, dan kami mengatur properti objek. Kami juga mengubah warna dan bentuk objek dengan menggunakan
setter
fungsi, dan membuktikan bahwa perubahannya tetap setelah memanggilgetInfo()
setelah perubahan ini.Agak terlambat, tapi saya harap ini membantu. Saya sudah menguji ini dengan
mocha
unit-testing, dan itu bekerja dengan baik.sumber
Mereka melakukannya jika Anda menggunakan TypeScript - open source dari MicroSoft :-)
Teks skrip memungkinkan Anda 'memalsukan' konstruksi OO yang dikompilasi menjadi konstruksi javascript. Jika Anda memulai proyek besar itu mungkin menghemat banyak waktu dan hanya mencapai tonggak versi 1.0.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Kode di atas 'dikompilasi' ke:
sumber
Dalam JavaScript, jenis doa mendefinisikan perilaku fungsi:
func()
obj.func()
new func()
func.call()
ataufunc.apply()
Fungsi dipanggil sebagai konstruktor saat memanggil menggunakan
new
operator:Setiap instance atau objek prototipe dalam JavaScript memiliki properti
constructor
, yang merujuk pada fungsi konstruktor.Periksa posting ini tentang properti konstruktor.
sumber
Saat menggunakan template Blixt yang hebat dari atas, saya menemukan bahwa itu tidak bekerja dengan baik dengan multi-level inheritance (MyGrandChildClass memperluas MyChildClass memperluas MyClass) - itu siklus memanggil konstruktor orang tua pertama berulang kali. Jadi di sini adalah solusi sederhana - jika Anda perlu warisan multi-level, daripada menggunakan
this.constructor.super.call(this, surName);
penggunaanchainSuper(this).call(this, surName);
dengan fungsi rantai didefinisikan seperti ini:sumber
http://www.jsoops.net/ cukup bagus untuk oo di Js. Jika menyediakan privat, terlindungi, variabel dan fungsi publik, dan juga fitur Warisan. Kode Contoh:
sumber
hanya untuk menawarkan beberapa variasi. ds.oop adalah cara yang bagus untuk mendeklarasikan kelas dengan konstruktor dalam javascript. Ini mendukung setiap jenis warisan yang mungkin (Termasuk 1 jenis yang bahkan c # tidak mendukung) serta Antarmuka yang bagus.
sumber
Di sini kita perlu memperhatikan satu poin dalam java script, ini adalah bahasa tanpa kelas namun, kita dapat mencapainya dengan menggunakan fungsi dalam java script. Cara paling umum untuk mencapai ini kita perlu membuat fungsi dalam java script dan menggunakan kata kunci baru untuk membuat objek dan menggunakan kata kunci ini untuk mendefinisikan properti dan metode. Berikut adalah contohnya.
sumber
Dalam sebagian besar kasus, Anda harus mendeklarasikan properti yang Anda butuhkan dengan cara apa pun sebelum Anda dapat memanggil metode yang memberikan informasi ini. Jika awalnya Anda tidak perlu mengatur properti, Anda bisa memanggil metode di dalam objek seperti itu. Mungkin bukan cara yang paling cantik untuk melakukan ini tetapi ini masih berfungsi.
sumber