Penggunaan kembali kode dan prinsip -prinsipnya
代码复用, seperti namanya, adalah menggunakan kembali bagian atau bahkan semua kode yang telah ditulis untuk membangun program baru. Saat berbicara tentang penggunaan kembali kode, hal pertama yang dapat kita pikirkan adalah继承性. Prinsip penggunaan kembali kode adalah:
优先使用对象组合,而不是类继承Di JS, karena tidak ada konsep kelas, konsep contoh tidak terlalu bermakna. Objek di JS adalah pasangan nilai kunci sederhana yang dapat dibuat dan dimodifikasi secara dinamis.
Tetapi dalam js , kita dapat membuat instantiasi objek menggunakan konstruktor dan operator new , yang memiliki kesamaan sintaks dengan bahasa pemrograman lain yang menggunakan kelas.
Misalnya:
var trigkit4 = new Person(); js tampaknya menjadi kelas ketika memanggil Person konstruktor, tetapi sebenarnya masih merupakan fungsi, yang memberi kita beberapa ide pengembangan dan pola warisan yang dianggap didasarkan pada kelas, yang dapat kita sebut "pola warisan klasik".
Model warisan tradisional membutuhkan kata kunci class . Kami berasumsi bahwa model warisan kelas di atas adalah现代继承模式, yang merupakan model yang tidak perlu dipertimbangkan dengan cara kelas.
Mode warisan klasik
Lihat dua contoh berikut dari Parent() dan Child() :
<script type="text/javascript">Function Parent (Name) {
this.name = name || 'Allen';
}
Parent.prototype.say = function () {
kembalikan nama ini;
}
function child (name) {}
// Buat objek dengan konstruktor induk dan tetapkan objek ke prototipe anak untuk mencapai warisan
fungsi warisan (c, p) {
C.prototype = new p (); // atribut prototipe harus menunjuk ke suatu objek, bukan fungsi
}
// Memanggil fungsi warisan yang dinyatakan
warisan (anak, orang tua);
</script>
Ketika suatu objek dibuat menggunakan pernyataan new Child() , ia memperoleh fungsinya dari instance Parent() melalui prototipe, seperti:
var kid = new Child();kid.say();//AllenRantai prototipe
Mari kita bahas bagaimana rantai prototipe bekerja dalam mode warisan kelas. Kami menganggap objek sebagai blok di suatu tempat dalam memori yang berisi data dan referensi ke blok lain. Ketika suatu objek dibuat menggunakan pernyataan new Parent() , blok seperti ini di sebelah kiri gambar di bawah ini akan dibuat. Blok ini menyimpan atribut name . Jika Anda ingin mengakses metode say() , kami dapat mengakses __proto__ Parent.prototype di sebelah kanan dengan menunjuk ke atribut prototype dari Parent() .
Jadi, apa yang terjadi saat membuat objek baru dengan var kid = new Child() ? Seperti yang ditunjukkan pada gambar di bawah ini:
Objek yang dibuat menggunakan pernyataan new Child() hampir kosong kecuali untuk tautan implisit __proto__ . Dalam hal ini, __proto__ menunjuk ke objek yang dibuat menggunakan pernyataan new Parent() dalam fungsi inherit()
Saat mengeksekusi kid.say() , karena objek blok di sudut kiri bawah tidak memiliki metode say() , itu akan meminta objek blok tengah melalui rantai prototipe. Namun, objek blok tengah juga tidak memiliki metode say() , sehingga mengikuti rantai prototipe untuk menanyakan objek blok paling kanan, dan objek kebetulan memiliki metode say() . Apakah itu selesai?
Eksekusi belum selesai di sini. this.name direferensikan dalam metode say() , yang menunjuk pada objek yang dibuat oleh konstruktor. Di sini, itu menunjuk ke blok new Child() . Namun, tidak ada atribut name di new Child() . Untuk alasan ini, blok perantara akan ditanyakan, dan blok perantara kebetulan memiliki atribut name . Pada titik ini, permintaan rantai prototipe telah selesai.
Untuk diskusi lebih rinci, silakan lihat artikel saya: JavaScript Learning Notes (v) Penjelasan terperinci tentang prototipe dan rantai prototipe
Prototipe bersama
Aturan pola ini adalah bahwa anggota yang dapat digunakan kembali harus ditransfer ke prototipe daripada ditempatkan di dalamnya. Oleh karena itu, untuk tujuan warisan, apa pun yang layak diwarisi harus diimplementasikan dalam prototipe. Oleh karena itu, Anda dapat mengatur prototipe objek anak dan prototipe objek induk yang sama dengan contoh di bawah ini:
function inherit(C,P){C.prototype = p.prototype;
}
Objek anak dan objek induk berbagi prototipe yang sama dan dapat mengakses metode say() secara setara. Namun, objek anak tidak mewarisi atribut name
Warisan prototipe
Prototipe warisan adalah model warisan tanpa kelas "modern". Lihat contoh berikut:
<script type="text/javascript">// objek yang akan diwariskan
var parent = {
Nama: "Jack" // Tidak ada titik koma di sini
};
//新对象var anak = objek (induk);
alert(child.name);//Jack</script>
Dalam mode prototipe, tidak perlu menggunakan literal objek untuk membuat objek induk. Seperti yang ditunjukkan pada kode berikut, Anda dapat menggunakan konstruktor untuk membuat objek induk. Dengan melakukan hal itu, baik sifatnya sendiri dan sifat -sifat prototipe konstruktor akan diwarisi.
<script type="text/javascript">// konstruktor induk
function person () {
this.name = "trigkit4";
}
// Tambahkan ke atribut prototipe
Person.prototype.getName = function () {
kembalikan nama ini;
};
// Buat objek kelas orang baru
var obj = orang baru ();
//mewarisi
var kid = objek (obj);
alert (kid.getname ()); // trigkit4
</script>
Dalam mode ini, Anda dapat memilih untuk mewarisi hanya objek prototipe yang ada di konstruktor yang ada. Objek mewarisi dari objek, terlepas dari bagaimana objek induk dibuat, seperti yang ditunjukkan dalam contoh berikut:
<script type="text/javascript">// konstruktor induk
function person () {
this.name = "trigkit4";
}
// Tambahkan ke atribut prototipe
Person.prototype.getName = function () {
kembalikan nama ini;
};
// Buat objek kelas orang baru
var obj = orang baru ();
//mewarisi
var kid = objek (person.prototype);
console.log (typeof kid.getname); // fungsi, karena ada di prototipe
console.log (typeof kid.name); // tidak ditentukan, karena hanya prototipe ini yang diwariskan
</script>