Rumah >hujung hadapan web >tutorial js >Penyelesaian masalah warisan kelas tanpa parameter Javascript dan kemahiran javascript

Penyelesaian masalah warisan kelas tanpa parameter Javascript dan kemahiran javascript

WBOY
WBOYasal
2016-05-16 16:11:391094semak imbas

Apabila ia datang kepada warisan kelas Javascript, ia mesti tidak dapat dipisahkan daripada rantaian prototaip, tetapi warisan yang dilaksanakan hanya melalui rantaian prototaip mempunyai banyak kelemahan.

Masalah dengan warisan kelas tanpa parameter

Mari kita lihat contoh kod untuk melaksanakan pewarisan B daripada A:

Salin kod Kod adalah seperti berikut:

fungsi A() {
}
A.prototype.a1 = function() { };

fungsi B() {
}
B.prototaip = baru A();
B.prototype.b1 = function() { };

var b = B baharu();
alert(b.constructor == A); // benar
makluman(b.pembina == B); // palsu


Masalah utama dengan kod ini ialah:

1. A perlu dijadikan contoh sebagai prototaip B. Pada masa ini, pembina A dilaksanakan. Tetapi menurut peraturan berorientasikan objek, sebelum membuat instantiat B, pembina B dan kelas induknya A tidak boleh dilaksanakan.

2. Menukar prototaip B, menyebabkan b.pembina bukan B tetapi A.

Terdapat masalah dengan warisan kelas parameter

Andaikan kedua-dua A dan B mempunyai dua parameter rentetan s1 dan s2 A mengira jumlah panjang dua rentetan B secara langsung memanggil A dengan s1 dan s2 sebagai parameter:

Salin kod Kod adalah seperti berikut:

fungsi A(s1, s2) {
​this.totalLength = s1.panjang s2.panjang;
}
A.prototype.a1 = function() { 
};

fungsi B(s1, s2) {
}
B.prototaip = baru A();
B.prototype.b1 = function() {
};

B("ab" baharu, "123");


Seperti yang anda boleh lihat, tiada cara untuk menghantar s1 dan s2 kepada A dalam kod ini, dan kerana tiada parameter apabila menginstant A sebagai prototaip B, pengecualian berlaku:
Salin kod Kod adalah seperti berikut:

s1 tidak ditentukan

Penyelesaian

Skop s1 dan s2 hanya dalam B. Jika anda ingin memindahkannya ke A, anda hanya boleh beroperasi dalam B. Ini boleh dicapai dengan bantuan kaedah penggunaan fungsi:

Salin kod Kod adalah seperti berikut:

fungsi B(s1, s2) {
A.terapkan(ini, hujah);
makluman(this.totalLength);
}

Soalan seterusnya ialah bagaimana untuk menambah kaedah A kepada prototaip B. Ini tidak sukar, hanya melintasi A.prototaip dan salin kaedah ke B.prototaip. Perlu diingatkan bahawa untuk kaedah dengan nama yang sama, subkelas secara semula jadi diutamakan (lebih muatan), jadi ia tidak boleh ditindih:
Salin kod Kod adalah seperti berikut:

untuk (var m dalam A.prototaip) {
​if (!B.prototype[m]) { // Kelas induk tidak boleh mengatasi kaedah subkelas
​B.prototaip[m] = A.prototaip[m];
}
}

Posskrip

Memandangkan bahasa peringkat tinggi seperti C# dan Java telah meninggalkan berbilang warisan, artikel ini hanya membincangkan warisan tunggal. Kaedah pewarisan yang diterangkan dalam artikel ini juga akan ditulis sebagai lanjutan daripada jRaiser dan akan dikeluarkan kemudian.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn