Berbicara tentang warisan kelas Javascript, tidak dapat dihindari bahwa rantai prototipe tidak dapat dipisahkan, tetapi warisan hanya melalui rantai prototipe memiliki banyak kekurangan.
Masalah pewarisan tidak ada parameter
Pertama -tama mari kita lihat sepotong kode sampel untuk mengimplementasikan w warisan dari A:
Salinan kode adalah sebagai berikut:
fungsi a () {
}
A.prototype.a1 = function () {};
fungsi b () {
}
B.prototype = baru a ();
B.prototype.b1 = function () {};
var b = baru b ();
peringatan (b.constructor == a); // BENAR
peringatan (b.constructor == b); // PALSU
Masalah utama dengan kode ini adalah:
1. A perlu dipakai sebagai prototipe B, dan konstruktor A dieksekusi saat ini. Namun, menurut aturan yang berorientasi objek, B dan kelas induknya tidak boleh dieksekusi sebelum instantiating B.
2. Mengubah prototipe B, menghasilkan b.constructor bukan B tetapi A.
Ada masalah dengan warisan kelas ginseng
Misalkan A dan B memiliki dua parameter string S1 dan S2. A menghitung panjang total dari dua string, dan B secara langsung memanggil A dengan S1 dan S2 sebagai parameter:
Salinan kode adalah sebagai berikut:
fungsi a (s1, s2) {
this.totallength = s1.length + s2.length;
}
A.prototype.a1 = function () {
};
fungsi b (s1, s2) {
}
B.prototype = baru a ();
B.prototype.b1 = function () {
};
B baru B ("AB", "123");
Seperti yang Anda lihat, tidak ada cara untuk meneruskan S1 dan S2 ke A dalam kode ini, dan karena tidak ada parameter saat instantiating A sebagai prototipe B, pengecualian terjadi:
Salinan kode adalah sebagai berikut:
S1 tidak terdefinisi
Larutan
Ruang lingkup S1 dan S2 hanya dalam B. untuk meneruskannya ke A, Anda hanya dapat beroperasi di B. dapat dicapai dengan menggunakan metode Function's Apply:
Salinan kode adalah sebagai berikut:
fungsi b (s1, s2) {
A. berlaku (ini, argumen);
waspada (this.totallength);
}
Pertanyaan berikutnya adalah bagaimana menambahkan metode A ke prototipe B. Ini tidak sulit, cukup melalui A.Prototype dan salin metode ke B.Prototype. Perlu dicatat bahwa untuk metode dengan nama yang sama, subclass lebih disukai (kelebihan beban), sehingga mereka tidak dapat diganti:
Salinan kode adalah sebagai berikut:
untuk (var m di A.prototype) {
if (! B.Prototype [m]) {// Metode kelas induk tidak dapat mengganti subkelas
B.Prototype [m] = a.prototype [m];
}
}
nota bene
Mempertimbangkan bahwa bahasa tingkat tinggi seperti C# dan Java telah meninggalkan banyak warisan, situasi warisan tunggal dibahas dalam artikel ini. Metode warisan yang dijelaskan dalam artikel ini juga akan ditulis sebagai perpanjangan dari Jraiser dan akan dirilis nanti.