Konsep warisan js
Dua kaedah pewarisan berikut biasanya digunakan dalam js:
Pewarisan rantai prototaip (warisan antara objek)
Warisan kelas (warisan antara pembina)
Memandangkan js bukanlah bahasa yang benar-benar berorientasikan objek seperti java, js adalah berdasarkan objek dan tidak mempunyai konsep kelas. Oleh itu, jika anda ingin melaksanakan warisan, anda boleh menggunakan mekanisme prototaip js atau kaedah memohon dan memanggil
Dalam bahasa berorientasikan objek, kami menggunakan kelas untuk mencipta objek tersuai. Walau bagaimanapun, segala-galanya dalam js adalah objek, jadi bagaimana untuk mencipta objek tersuai? Ini memerlukan penggunaan prototaip js:
Kita hanya boleh menganggap prototaip sebagai templat Objek tersuai yang baru dibuat adalah semua salinan templat ini (prototaip) (sebenarnya bukan salinan tetapi pautan, tetapi pautan ini tidak kelihatan. Baharu Terdapat penunjuk __Proto__ yang tidak kelihatan di dalamnya. objek instantiated, menunjuk ke objek prototaip).
JS boleh mensimulasikan fungsi kelas melalui pembina dan prototaip. Selain itu, pelaksanaan pewarisan kelas js juga bergantung pada rantaian prototaip.
Warisan prototaip dan warisan kelas
Warisan klasik sedang memanggil pembina supertype di dalam pembina subjenis.
Warisan kelas yang ketat tidak begitu biasa, dan biasanya digunakan dalam gabungan:
fungsi Sub(){
Super.call(ini);
}
Warisan rantai prototaip
Untuk subkelas mewarisi atribut (termasuk kaedah) kelas induk, anda perlu mentakrifkan pembina terlebih dahulu. Kemudian, tetapkan contoh baharu kelas induk kepada prototaip pembina. Kodnya adalah seperti berikut:
fungsi Child(){
This.age = 12;
}
Child.prototype = new Parent();//Child mewarisi Ibu bapa dan membentuk rantai melalui prototaip
var test = new Child();
makluman(ujian.umur);
alert(test.name);//Dapatkan atribut yang diwarisi
//Teruskan pewarisan rantai prototaip
Fungsi Abang(){ //pembinaan abang
This.weight = 60;
}
Brother.prototype = new Child();//Teruskan pewarisan rantai prototaip
var abang = Abang baru();
alert(brother.name);//Mewarisi Ibu Bapa dan Anak, muncul mike
alert(brother.age);//pop-up 12
Warisan rantai prototaip di atas tiada pautan, iaitu Object Semua pembina mewarisi daripada Object. Mewarisi Objek dilakukan secara automatik dan tidak memerlukan kita mewarisi secara manual Jadi apakah gabungan mereka?
Tentukan hubungan antara prototaip dan contoh
Hubungan antara prototaip dan kejadian boleh ditentukan dalam dua cara. Kaedah operator instanceof dan isPrototypeof():
Selagi prototaip muncul dalam rantaian prototaip, ia boleh dikatakan sebagai prototaip contoh yang diperoleh daripada rantaian prototaip Oleh itu, kaedah isPrototypeof() juga akan kembali benar
Dalam js, fungsi yang diwarisi dipanggil jenis super (kelas induk, kelas asas juga boleh diterima), dan fungsi yang diwarisi dipanggil subjenis (subkelas, kelas terbitan). Terdapat dua masalah utama dengan menggunakan warisan prototaip:
Pertama, penggantian literal prototaip akan memutuskan hubungan, menggunakan prototaip jenis rujukan, dan subjenis tidak boleh menghantar parameter kepada superjenis.
Kelas pseudo menyelesaikan masalah perkongsian rujukan dan ketidakupayaan untuk lulus parameter jenis super Kita boleh menggunakan teknologi "pembina yang dipinjam"
Pijam pembina (warisan kelas)
fungsi Kanak-kanak(umur){
Parent.call(ini,umur);
}
var test = new Child(21);
makluman(ujian.umur);//21
alert(test.name);//mike,jack,smith
Test.name.push('bil');
alert(test.name);//mike,jack,smith,bill
Pusaka gabungan
Warisan gabungan ialah kaedah warisan yang biasa digunakan Idea di sebaliknya ialah menggunakan rantaian prototaip untuk mewarisi sifat dan kaedah prototaip, dan meminjam pembina untuk mewarisi sifat contoh. Dengan cara ini, penggunaan semula fungsi dicapai dengan mentakrifkan kaedah pada prototaip, dan setiap contoh dijamin mempunyai atributnya sendiri.
Penggunaan panggilan(): Panggil kaedah objek dan gantikan objek semasa dengan objek lain.
Warisan jenis ini menggunakan prototaip untuk mencipta objek baharu berdasarkan objek sedia ada tanpa mencipta jenis tersuai Ia dipanggil warisan prototaip
b1.name = 'mike';
makluman(b1.name);//mike
makluman(b1.arr);//abang,kakak,baba
b1.arr.push('ibu bapa');
alert(b1.arr);//abang, kakak, baba, ibu bapa
var b2 = obj(kotak);
alert(b2.name);//trigkit4
alert(b2.arr);//abang, kakak, baba, ibu bapa
Warisan prototaip mula-mula mencipta pembina sementara di dalam fungsi obj(), kemudian menggunakan objek masuk sebagai prototaip pembina ini, dan akhirnya mengembalikan contoh baharu jenis sementara ini.
Warisan parasit
Kaedah pewarisan ini menggabungkan corak kilang prototaip dengan tujuan merangkum proses penciptaan.
Masalah kecil dengan gabungan warisan
Warisan gabungan ialah corak warisan yang paling biasa digunakan dalam js, tetapi superjenis warisan gabungan akan dipanggil dua kali semasa penggunaan sekali apabila mencipta subjenis, dan masa yang lain di dalam pembina subjenis
Parent.prototype.run = fungsi () {
kembalikan this.name;
};
fungsi Kanak-kanak(nama, umur){
Parent.call(ini,umur);//Panggilan kedua
This.age = umur;
}
Child.prototype = new Parent();//Panggilan pertama
Kod di atas ialah warisan gabungan sebelumnya, jadi warisan gabungan parasit menyelesaikan masalah dua panggilan.
Warisan Kombinatorial Parasit
fungsi Induk(nama){
This.name = nama;
This.arr = ['abang', 'adik', 'ibu bapa'];
}
Parent.prototype.run = fungsi () {
kembalikan this.name;
};
fungsi Kanak-kanak(nama, umur){
Parent.call(ini,nama);
This.age =umur;
}
inheritPrototype(Ibu bapa, Anak);//Warisan dicapai melalui sini
var test = new Child('trigkit4',21);
Test.arr.push('anak saudara');
alert(test.arr);//
alert(test.run());//Hanya kaedah dikongsi
var test2 = new Child('jack',22);
alert(test2.arr);//Penyelesaian masalah sebut harga
panggil dan mohon
Fungsi global digunakan dan panggilan boleh digunakan untuk menukar penunjuk ini dalam fungsi, seperti berikut:
// Tentukan pembolehubah global
var fruit = "epal";
// Sesuaikan objek
pek var = {
buah: "oren"
};
// Bersamaan dengan window.foo();
foo.apply(window); // "apple", pada masa ini sama dengan window
//Ini dalam foo pada masa ini === pek
foo.apply(pack); // "oren"