Dalam JavaScript, kelas dapat digunakan untuk mengimplementasikan pemrograman berorientasi objek. Namun, kelas -kelas dalam JavaScript berbeda dari yang ada di Java, dan definisi serta penggunaannya yang sesuai juga berbeda.
Definisi kelas dalam JavaScript
Dalam JavaScript, semua objek yang berasal dari objek prototipe yang sama (prototipe) membentuk kelas; Artinya, kelas dalam JavaScript adalah konsep koleksi objek. Jika dua objek memiliki prototipe yang sama, mereka termasuk dalam kelas yang sama; Kelas di JavaScript bahkan tidak membutuhkan nama kelas. Kode berikut adalah contoh:
Salinan kode adalah sebagai berikut:
var p = {x: 42};
var a = object.create (p);
var b = object.create (p);
console.log (a === b); // false
console.log (object.getPrototypeOf (a) === object.getPrototypeOf (b)); // true
Dalam contoh di atas, objek A dan B memiliki objek prototipe yang sama (prototipe) P, sehingga A dan B milik kelas yang sama (meskipun tidak satu pun dari kelas ini memiliki nama kelas), dan mereka mewarisi properti x dengan nilai 42 dari objek prototipe p.
Dari contoh ini, kita dapat melihat bahwa fungsi objek prototipe setara dengan templat, dan banyak objek dapat diturunkan/dibuat darinya. Statusnya sama dengan kode kelas dalam bahasa Java dan merupakan inti dari definisi kelas dalam JavaScript. Objek prototipe dalam contoh berikut akan tampak lebih seperti kode kelas:
Salinan kode adalah sebagai berikut:
var p = {
Increment_by: 1,
increment: function (x) {
return x + this.increment_by;
}
}
var a = object.create (p);
var b = object.create (p);
Console.log (A.Increment (7)); // 8
Console.log (B.Increment (9)); // 10
Dalam contoh di atas, objek prototipe P mendefinisikan properti (increment_by) dengan nilai 1 dan fungsi bernama Increment; Objek A dan B Dapatkan fungsi increment_by dan kenaikan dari template p. Saat menyebut fungsi kenaikan objek A atau B, JavaScript akan mencoba untuk mendapatkan nilai Increment_by dari A atau B (this.increment_by); Karena increment_by diperoleh dari P, nilainya semua 1 - variabel dengan nilai yang sama, mirip dengan variabel kelas statis di java. Oleh karena itu, dalam contoh di atas, semua karakter modal digunakan saat menyebut variabel increment_by.
Dalam contoh di atas, semua objek yang dibuat dari template p (objek yang termasuk dalam kelas yang sama) memiliki sifat dan perilaku yang sama. Tetapi pada kenyataannya, untuk objek yang berbeda dari kelas yang sama, selain memiliki atribut/perilaku yang ditentukan oleh kelas, mereka sering memiliki beberapa atribut dan perilaku unik. Oleh karena itu, jika Anda perlu menggunakan templat prototipe sebagai kelas, Anda harus menyesuaikan setiap objek yang berasal dari itu:
Salinan kode adalah sebagai berikut:
var p = {
Increment_by: 1,
increment: function (x) {
return x + this.increment_by + this.custom_increment_by;
}
}
var a = object.create (p);
var b = object.create (p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
Console.log (A.Increment (7)); // 8
Console.log (B.Increment (9)); // 11
Dalam contoh ini, objek A dan B yang dibuat dari template p memiliki variabel custom_increment_by yang nilainya tidak harus sama satu sama lain, dan hasil akhir dari perilaku fungsi kenaikan () terkait dengan nilai custom_increment_by. Secara umum, pekerjaan menyesuaikan objek baru sering dilakukan dalam fungsi terpadu:
Salinan kode adalah sebagai berikut:
var p = {
Increment_by: 1,
increment: function (x) {
return x + this.increment_by + this.custom_increment_by;
}
}
Fungsi getIncrementalclassObject (CustomIncrementByValue) {
var incrementalobj = object.create (p);
incrementalobj.custom_increment_by = CustomIncrementByValue;
Return Incrementalobj;
}
var a = getIncrementalclassObject (0);
var b = getIncrementalclassObject (1);
Console.log (A.Increment (7)); // 8
Console.log (B.Increment (9)); // 11
Dengan cara ini, definisi kelas diselesaikan melalui objek prototipe P dan GetIncrementalClassObject () Fungsi: Objek prototipe yang objek prototipenya p dapat diperoleh dengan memanggil fungsi getIncrementalClassObject (), dan objek baru ini dapat dikustomisasi ke tingkat tertentu selama panggilan get -classobjects.) Perlu dicatat bahwa kelas yang ditentukan ini tidak memiliki nama kelas saat ini. Demi deskripsi, itu akan disebut Incremental.
Melihat kembali pekerjaan yang dilakukan dalam fungsi GetIncrementalClassObject (), Anda dapat melihat bahwa proses membuat objek baru dari kelas tambahan adalah sebagai berikut:
1. Buat objek kosong dan tentukan objek prototipe sebagai p.
2. Kustomisasi objek kosong yang baru dibuat ini sesuai dengan nilai parameter yang berbeda.
3. Mengembalikan objek baru yang telah disesuaikan.
Dalam JavaScript, Anda dapat dengan cepat menyelesaikan definisi kelas dan pembuatan objek baru dengan menggunakan konstruktor.
Konstruktor (konstruktor) dalam javascript
Dari contoh kelas tambahan di atas, kita dapat melihat bahwa mendefinisikan kelas baru memerlukan dua bagian kode: membuat objek prototipe sebagai templat, membuat fungsi khusus untuk menginisialisasi objek baru; Membuat objek baru dari kelas melewati tiga proses: Menentukan objek prototipe dari objek baru, menyesuaikan/menginisialisasi objek baru, dan mengembalikan objek baru ini. Dalam JavaScript, semua ini dapat dilakukan melalui konstruktor (konstruktor).
Konstruktor dalam JavaScript adalah fungsi yang memikul tanggung jawab menginisialisasi objek baru; Prototipe fungsi konstruktor ini digunakan sebagai templat untuk membuat objek baru. Mengambil kelas tambahan di atas sebagai contoh, setelah menggunakan konstruktor untuk menulis ulang kode, sepertinya ini:
Salinan kode adalah sebagai berikut:
fungsi inkremental (CustomIncrementByValue) {
this.custom_increment_by = CustomIncrementByValue;
}
Incremental.prototype = {
Increment_by: 1,
increment: function (x) {
return x + this.increment_by + this.custom_increment_by;
}
}
var a = inkremental baru (0);
var b = inkremental baru (1);
Console.log (A.Increment (7)); // 8
Console.log (B.Increment (9)); // 11
Proses membuat objek baru menggunakan fungsi konstruktor melalui kata kunci baru benar -benar melewati tahap berikut:
Buat objek kosong baru.
1. Tunjuk objek prototipe objek ini ke properti prototipe dari fungsi konstruktor.
2. Gunakan objek ini sebagai parameter ini dan jalankan fungsi konstruktor.
3. Ini adalah hal yang sama dengan pekerjaan sebelumnya yang dilakukan dalam fungsi GetIncrementalClassObject ().
Nama kelas
Saat membuat objek menggunakan konstruktor, objek yang sesuai memiliki "nama kelas", yang dapat diverifikasi dari hasil instance dari operator:
Salinan kode adalah sebagai berikut:
console.log (instance dari inkremental); // true
console.log (b instance dari inkremental); // true
Namun, contoh operator tidak menentukan apakah objek dibuat oleh konstruktor tambahan. Instance dari operator hanya menentukan apakah objek prototipe objek adalah inkremental.prototype. Ketika ada dua konstruktor dengan prototipe yang sama, instance dari operator akan mengembalikan benar secara seragam tanpa membedakan konstruktor mana yang digunakan untuk membuat objek.
Salinan kode adalah sebagai berikut:
function incremental2 (CustomIncrementByValue) {
this.custom_increment_by = CustomIncrementByValue + 3;
}
Incremental2.prototype = incremental.prototype;
console.log (instance dari inkremental2); // true