Tidak seperti bahasa pengaturcaraan berasaskan kelas seperti C dan Java, pewarisan dalam JavaScript adalah berasaskan prototaip. Pada masa yang sama, kerana JavaScript ialah bahasa yang sangat fleksibel, terdapat banyak cara untuk melaksanakan warisan.
Konsep asas pertama ialah mengenai pembina dan rantai prototaip Pembina objek induk dipanggil Ibu Bapa, pembina objek anak dipanggil Anak, dan objek ibu bapa dan anak yang sepadan adalah ibu bapa dan anak.
Terdapat atribut tersembunyi [[prototaip]] (nota bukan prototaip) dalam Chrome ia adalah __proto__, tetapi dalam sesetengah persekitaran ia tidak boleh diakses. Apabila mengakses sifat atau kaedah mana-mana objek, semua sifat objek akan dicari terlebih dahulu Jika tidak dijumpai, sifat pada objek prototaip akan dicari langkah demi langkah di sepanjang rantai prototaip mengikut [[prototaip]] sehingga ditemui. Jika tidak, kembali tidak ditentukan.
1. Warisan rantaian prototaip:
Rantai prototaip ialah cara lalai untuk melaksanakan pewarisan dalam JavaScript Jika anda mahu objek anak mewarisi objek induk, cara paling mudah ialah menghalakan atribut prototaip pembina objek anak kepada contoh objek induk:
2. Warisan prototaip (rantaian bukan prototaip):
Untuk mengelakkan masalah berulang kali mencipta contoh objek prototaip dalam kaedah sebelumnya, anda boleh terus menghalakan prototaip pembina objek anak kepada prototaip pembina objek induk Dengan cara ini, semua sifat dan kaedah dalam Parent .prototaip juga boleh digunakan semula Pada masa yang sama, tidak perlu membuat contoh objek prototaip berulang kali:
3. Warisan pembina sementara:
Untuk menyelesaikan masalah di atas, anda boleh menggunakan pembina sementara untuk bertindak sebagai lapisan perantaraan Semua operasi pada prototaip objek kanak-kanak diselesaikan pada contoh pembina sementara dan tidak akan menjejaskan prototaip objek induk:
Kita boleh merangkum kerja di atas ke dalam fungsi, dan memanggil fungsi ini pada masa hadapan boleh melaksanakan kaedah pewarisan ini dengan mudah:
Kaedah warisan ini pada asasnya tidak mengubah hubungan rantaian prototaip, tetapi secara langsung menyalin semua atribut dalam objek prototaip induk kepada prototaip objek anak Sudah tentu, salinan di sini hanya digunakan untuk jenis data asas dan jenis objek hanya menyokong Pass melalui rujukan.
5. Pewarisan antara objek:
Selain kaedah pewarisan antara pembina, anda juga boleh terus mewarisi antara objek tanpa pembina. Iaitu, salin atribut objek secara langsung, termasuk salinan cetek dan salinan dalam.
Salinan cetek:
Terima objek yang akan diwarisi, cipta objek kosong baharu pada masa yang sama, salin sifat objek yang akan diwarisi kepada objek baharu dan kembalikan objek baharu:
Salinan dalam:
Masalah salinan cetek juga jelas Ia tidak boleh menyalin atribut jenis objek tetapi hanya boleh lulus rujukan Untuk menyelesaikan masalah ini, salinan dalam mesti digunakan. Fokus salinan dalam terletak pada panggilan rekursif salinan Apabila sifat jenis objek dikesan, objek atau tatasusunan yang sepadan dicipta dan nilai jenis asas disalin satu demi satu.
6. Warisan prototaip:
Dengan bantuan objek induk, cipta objek baharu yang diprototaip oleh objek induk melalui pembina:
7. Gemischte Verwendung von prototypischer Vererbung und Attributkopie:
Bei der prototypischen Vererbungsmethode wird das untergeordnete Objekt auf der Grundlage des übergebenen übergeordneten Objekts erstellt. Gleichzeitig können zusätzlich zu den vom übergeordneten Objekt bereitgestellten Eigenschaften zusätzliche Objekte übergeben werden, die kopiert werden müssen:
für (var i in stuff) {
n[i] = stuff[i]
}
Geben Sie n
zurück
}
Diese Methode beinhaltet nicht den Betrieb der Prototypenkette. Es werden mehrere Objekte übergeben, deren Attribute kopiert werden müssen, und alle Attribute werden nacheinander kopiert:
9. Konstruktorausleihe:
Die Methoden call() und apply() in JavaScript sind sehr einfach zu verwenden, und ihre Funktion, den Kontext der Methodenausführung zu ändern, kann auch eine Rolle bei der Implementierung der Vererbung spielen. Das sogenannte Konstruktor-Ausleihen bezieht sich auf das Ausleihen des Konstruktors des übergeordneten Objekts im Konstruktor des untergeordneten Objekts, um Folgendes zu betreiben:
Funktion Child() {
Parent.apply(this, arguments)
}
var child = new Child()
console.log(child.name)
Der Nachteil dieser Methode besteht darin, dass der neue Operator während des Konstruktionsprozesses des untergeordneten Objekts nicht verwendet wird, sodass das untergeordnete Objekt keine Attribute des übergeordneten Prototypobjekts erbt Das Kind wird undefiniert sein.
Um dieses Problem zu lösen, können Sie den Prototyp des untergeordneten Objektkonstruktors erneut manuell auf eine Instanz des übergeordneten Objekts setzen:
Um dieses Problem zu lösen, müssen wir einen Aufruf an den Konstruktor des übergeordneten Objekts entfernen. Das Ausleihen des Konstruktors kann nicht weggelassen werden, daher kann der letzte Aufruf nur entfernt werden, indem er iterativ kopiert: