Rumah >hujung hadapan web >tutorial js >Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

WBOY
WBOYasal
2016-05-16 15:09:541283semak imbas

ECMAScript hanya menyokong warisan pelaksanaan dan warisan pelaksanaannya bergantung terutamanya pada rantaian prototaip.

Rantai Prototaip

Idea asas rantaian prototaip ialah menggunakan prototaip untuk membenarkan satu jenis rujukan mewarisi sifat dan kaedah jenis rujukan yang lain. Setiap pembina mempunyai objek prototaip, objek prototaip mengandungi penunjuk kepada pembina, dan contoh mengandungi penunjuk kepada objek prototaip. Jika: kita menjadikan objek prototaip A sama dengan contoh lain jenis B, maka objek prototaip A akan mempunyai penunjuk yang menunjuk ke objek prototaip B, dan objek prototaip B yang sepadan menyimpan penunjuk kepada pembinanya. Jika objek prototaip B ialah contoh jenis lain, maka hubungan di atas masih dipegang, dan seterusnya, rantaian kejadian dan prototaip terbentuk.

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Rajah hubungan antara kejadian dan pembina dan prototaip adalah seperti berikut:

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

person.constructor kini menunjuk ke Parent Ini kerana Child.prototype menghala ke prototaip Parent, dan pembina objek prototaip Parent menghala ke Parent.

Apabila mengakses sifat instance dalam mod baca, harta tersebut akan dicari terlebih dahulu dalam contoh tersebut. Dalam penyepaduan melalui rantaian prototaip, carian diteruskan ke atas rantai sehingga penghujung rantai dicapai.

Contohnya, semasa memanggil kaedah person.getParentValue(), 1) cari instance; 2) cari Child.prototype; 3) cari Parent.prototype;

1. Prototaip lalai

Rantai prototaip yang ditunjukkan dalam contoh sebelumnya tiada pautan Semua jenis rujukan mewarisi Objek secara lalai, dan warisan ini juga dilaksanakan melalui rantaian prototaip. Oleh itu, prototaip lalai mengandungi penuding dalaman yang menunjuk ke Object.prototype, yang merupakan sebab asas mengapa semua jenis tersuai mewarisi kaedah lalai seperti toString() dan ValueOf(). Dalam erti kata lain Object.prototype ialah penghujung rantai prototaip.

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

2. Tentukan hubungan antara prototaip dan contoh

Hubungan antara prototaip dan contoh boleh ditentukan dalam dua cara Yang pertama ialah menggunakan operator instanceOf, dan yang kedua ialah menggunakan kaedah isPrototypeOf().
Pembina yang muncul dalam rantaian prototaip instanceOf semuanya akan kembali benar

console.log(person instanceOf Child);//true 

console.log(person instanceOf Parent);//true 
console.log(person instanceOf Object);//true 
isPrototype(),只要是原型链中出现过的原型,都可以说是该原型链所派生出来的实例的原型,因此也返回true. 
console.log(Object.prototype.isPrototypeOf(instance));//true 
console.log(Parent.prototype.isPrototypeOf(instance));//true 
console.log(Child.prototype.isPrototypeOf(instance));//true 

3. Tentukan kaedah dengan teliti

Subjenis kadangkala perlu mengatasi kaedah dalam supertype, atau menambah kaedah yang tidak wujud dalam supertype Nota: kod untuk menambah kaedah pada prototaip mesti diletakkan selepas pernyataan yang menggantikan prototaip.

Apabila getParentValue() dipanggil melalui tika Anak, kaedah yang ditakrifkan semula ini dipanggil, tetapi apabila getParentValue() dipanggil melalui tika Parent, kaedah asal dipanggil.

Adalah penting untuk ambil perhatian bahawa kedua-dua kaedah ini mesti ditakrifkan selepas contoh Induk menggantikan prototaip.

Satu lagi perkara yang memerlukan perhatian khusus ialah: apabila melaksanakan pewarisan melalui rantaian prototaip, anda tidak boleh menggunakan literal objek untuk mencipta kaedah prototaip, kerana berbuat demikian akan menimpa rantaian prototaip.

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Kod di atas hanya memberikan contoh Induk kepada objek prototaip Child, dan kemudian menggantikan prototaip dengan literal Selepas menggantikannya dengan literal, prototaip Kanak-kanak sebenarnya mengandungi contoh Objek dan bukannya Contoh Induk. , jadi rantaian prototaip yang kami bayangkan terputus Tiada kaitan antara Ibu Bapa dan Anak.

4 Masalah dengan rantai prototaip

Rantai prototaip sangat berkuasa dan boleh digunakan untuk melaksanakan pewarisan, tetapi terdapat juga beberapa masalah Masalah utama ialah sifat prototaip yang mengandungi nilai jenis rujukan akan dikongsi oleh semua keadaan. Jadi kami mentakrifkan sifat contoh dalam pembina. Tetapi apabila pewarisan dilaksanakan melalui prototaip, objek prototaip sebenarnya menjadi contoh jenis lain. Jadi sifat contoh yang asalnya ditakrifkan dalam pembina menjadi sifat prototaip.

Contohnya adalah seperti berikut:

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Atribut rakan ditakrifkan dalam pembina Induk, dan nilai atribut ialah tatasusunan (nilai jenis rujukan). Dengan cara ini, setiap tika Ibu Bapa akan mengandungi atribut rakannya sendiri. Apabila Anak mewarisi Ibu Bapa melalui rantai prototaip, Child.prototype juga menggunakan atribut rakan - ia seolah-olah atribut rakan ditakrifkan dalam Child.prototype. Dengan cara ini, semua kejadian Kanak-kanak akan berkongsi atribut rakan, jadi pengubahsuaian yang kami buat pada kid1.friends juga akan ditunjukkan dalam kid2.friends Jelas sekali, ini bukan yang kami mahu.

Satu lagi masalah dengan rantaian prototaip ialah apabila mencipta tika subjenis, anda tidak boleh menghantar parameter kepada pembina superjenis tanpa menjejaskan semua tika objek. Oleh itu, kami jarang menggunakan rantai prototaip sahaja.

pinjam pembina

Untuk menyelesaikan beberapa masalah yang disebabkan oleh mengandungi nilai jenis rujukan dalam prototaip, teknologi peminjam pembina telah diperkenalkan. Idea asas teknik ini adalah untuk memanggil pembina supertype di dalam pembina subjenis.

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Parent.call(this) memanggil pembina Ibu Bapa dalam konteks tika Anak yang baru dibuat. Panggil pembina Ibu Bapa dalam konteks contoh Anak yang baru dibuat. Dengan cara ini, kod permulaan objek yang ditakrifkan dalam fungsi Parent() dilaksanakan pada objek Kanak-kanak baharu, objek kid1 dan kid2 di sini. Dengan cara ini, setiap contoh Kanak-kanak akan mempunyai salinan harta rakannya sendiri.

Dengan meminjam pembina, parameter boleh dihantar kepada pembina supertype dalam pembina subjenis.

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Untuk memastikan bahawa kebiasaan subjenis tidak akan ditindih oleh pembina kelas induk, anda boleh menambah sifat subjenis selepas memanggil pembina kelas induk.
Masalah pembina:

Masalah dengan corak pembina ialah semua kaedah ditakrifkan dalam pembina, dan penggunaan semula fungsi adalah mustahil, oleh itu, corak yang meminjam pembina jarang digunakan secara bersendirian.

Pusaka gabungan

Warisan gabungan merujuk kepada menggabungkan teknik rantaian prototaip dan pembina peminjaman untuk memanfaatkan yang terbaik daripada kedua-dua dunia. Iaitu: menggunakan rantai prototaip untuk mencapai pewarisan sifat dan kaedah prototaip, dan meminjam pembina untuk mencapai pewarisan sifat contoh.

Penerangan terperinci tentang beberapa cara untuk melaksanakan warisan dalam kemahiran JavaScript (disyorkan)_javascript

Le constructeur Person définit deux attributs : nom et amis. Le prototype de Person définit une méthode sayName(). Lorsque le constructeur Child appelle le constructeur Parent, il transmet le paramètre name, puis définit son propre attribut age. Attribuez ensuite l'instance Person au prototype Child, puis définissez la méthode sayAge() sur le prototype. De cette façon, deux instances Child différentes ont leurs propres attributs, y compris les attributs de type référence, et peuvent utiliser la même méthode.
La combinaison de l'héritage évite les défauts des chaînes de prototypes et des constructeurs, combine leurs avantages et devient le modèle d'héritage le plus couramment utilisé en JavaScript. De plus, instanceOf et isPropertyOf() peuvent également reconnaître les objets créés sur la base d'un héritage combiné.

Enfin, il existe encore plusieurs modes qui n'ont pas été écrits sur les objets JS et l'héritage. En d'autres termes, je ne les ai pas étudiés en profondeur moi-même. Cependant, je pense que je peux d'abord appliquer le mode combinaison. De plus, vous devez savoir pourquoi vous choisissez le mode combinaison et pourquoi.

Concernant plusieurs façons d'implémenter l'héritage en JavaScript (recommandé), l'éditeur vous le présentera ici, j'espère que cela vous sera utile !

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