Satu. Dua prototaip
Ramai orang tahu bahawa JavaScript adalah warisan prototaip Setiap pembina mempunyai ahli prototaip, yang melaluinya warisan JavaScript boleh dijelaskan dengan indah
Malah, pewarisan JavaScript tidak boleh dilengkapkan dengan bergantung pada atribut ini sahaja.
Prototaip yang kami gunakan dalam kod untuk melengkapkan warisan tidak akan dibincangkan di sini. Anda boleh menyemak maklumat
Seorang lagi ahli prototaip yang tidak kelihatan.
Setiap contoh mempunyai atribut prototaip yang menunjuk kepada prototaip Atribut ini tidak boleh diakses, dan sudah tentu ia tidak boleh diubah suai, kerana ini adalah asas untuk mengekalkan warisan JavaScript.
2. Penyelenggaraan prototaip
Jawapannya ialah: daripada prototaip.
Oleh itu, kesimpulan berikut dibuat
Prototaip GuoyansiEx telah ditulis semula oleh tika Guoyansi, jadi pembina dalam prototaip GuoyansiEx secara semula jadi daripada tika Guoyansi.
Pembina dalam contoh Guoyansi berasal daripada Guoyansi.prototype Dan Guoyansi.prototype belum ditulis semula,
Jadi pembina Guoyansi.prototype menunjuk ke Guoyansi (pembina);
3. Apakah kegunaan prototaip yang tidak kelihatan?
Kami boleh mengendalikan rantai prototaip yang boleh dilihat untuk melengkapkan warisan kami, tetapi kami tidak dapat melihat atau mengendalikan rantai prototaip yang tidak kelihatan ini.
Pewarisan dalam berorientasikan objek mempunyai ciri: Subkelas mempunyai persamaan dengan kelas induk Oleh itu, dalam subkelas, anda tidak boleh menggunakan padam untuk memadam ahli yang diwarisi daripada kelas induk.
Untuk mengekalkan ciri ini, JavaScript mencipta atribut prototaip di dalam objek yang tidak dapat kita lihat dan tidak membenarkan pengguna mengaksesnya Dengan cara ini, pengguna boleh mengubah suai pembina untuk sebarang tujuan,
Ia tidak akan memusnahkan ciri kelas induk yang ada pada subkelas tersebut.
Ringkasnya: prototaip dalaman diperlukan oleh mekanisme pewarisan prototaip JavaScript, manakala prototaip luaran diperlukan oleh pengguna untuk melaksanakan pewarisan.
4 __proto__ dalam enjin Firefox SpiderMonkey
Ia masih kod ini.
Saya kini mahu mengakses umur atribut prototaip kelas induk Guoyansi bermula dari obj ke atas.
Ideanya ialah ini.
Langkah satu: obj2====>obj2.constructor.prototype
Bahagian 2: obj2.constructor.prototype===>GuoyansiEx.prototype;
Bahagian 3: GuoyansiEx.prototype===>obj1;
Bahagian 4: obj1.constructor====>Guoyansi
Bahagian 5: Guoyansi.prototype.age
Tulis seperti ini: console.log(obj2.constructor.prototype.constructor.prototype.age)//24;
Keputusan akhir ialah 24.
Keputusan akhir ialah 24. Ia boleh dilaksanakan seperti biasa, tetapi banyak buku mengatakan bahawa selepas pembina diubah suai, prototaip dalam kelas induk tidak dapat ditemui
SpiderMonkey menambahkan atribut bernama _proto_ pada mana-mana objek yang dicipta secara lalai, yang menunjuk kepada prototaip yang digunakan oleh pembina.
Sebenarnya, ia adalah rantaian prototaip halimunan yang kami nyatakan di atas, tetapi ia hanya didedahkan kepada umum di sini
Anda boleh mengakses umur
seperti ini
console.log(obj2.__proto__.__proto__.age);//24
Ini sememangnya berjaya mengakses atribut prototaip kelas induk, tetapi atribut ini hanya boleh digunakan untuk Firefox dan akan menyebabkan ralat dalam penyemak imbas lain.
Dalam E5, Object.getPrototypeOf() telah diperluaskan kepada Object dan anda boleh mengakses prototaip semua kelas induk.
Hasilnya ialah: GuoyansiEx
Guoyansi
Objek
Prototaip objek adalah batal
Secara peribadi, saya fikir ini harus dianggap sebagai salah satu intipati JavaScript berorientasikan objek, sila rujuk sendiri dan gunakannya dalam projek anda sendiri mengikut keperluan anda