Metode prototipe pertama:
// Ketua Function Function Person () {this.hair = 'black'; this.eye = 'hitam'; this.skin = 'yellow'; this.view = function () {return this.hair + ',' + this.eye + ',' + this.skin; }} // Fungsi subklass man () {this.feature = ['beard', 'strong']; } man.prototype = orang baru (); var one = new man (); Console.log (One.Feature); // ['jenggot', 'kuat'] console.log (one.hair); // black console.log (satu.eye); // black console.log (One.skin); // yellow console.log (one.view ()); // Hitam, hitam, kuningMetode ini adalah yang paling sederhana. Anda hanya perlu menetapkan nilai atribut prototipe dari subkelas ke instance yang diwariskan, dan kemudian Anda dapat secara langsung menggunakan metode kelas yang diwariskan.
Apa arti atribut prototipe? Prototipe adalah prototipe. Setiap objek (ditentukan oleh fungsi) memiliki properti prototipe default, yang merupakan jenis objek.
Dan atribut default ini digunakan untuk mengimplementasikan pemeriksaan rantai di atas. Ini berarti bahwa jika atribut suatu objek tidak ada, atribut akan ditemukan melalui objek yang dimiliki oleh atribut prototipe. Bagaimana jika prototipe tidak dapat ditemukan?
JS akan secara otomatis menemukan objek yang menjadi milik properti prototipe milik atribut prototipe, sehingga akan terus mengindeks melalui prototipe sampai properti atau prototipe ditemukan dan akhirnya kosong ("tidak terdefinisi");
Misalnya, dalam metode One.View () dalam contoh di atas, JS pertama -tama akan mencari apakah ada metode view () dalam satu contoh. Karena tidak ada, ia mencari atribut man.prototype, dan nilai prototipe adalah instance dari orang.
Contoh ini memiliki metode view (), sehingga panggilan berhasil.
Cara kedua adalah menerapkan:
// Ketua Function Function Person () {this.hair = 'black'; this.eye = 'hitam'; this.skin = 'yellow'; this.view = function () {return this.hair + ',' + this.eye + ',' + this.skin; }} // subkelas fungsi man () {// person.apply (ini, array baru ()); orang. this.feature = ['jenggot', 'kuat']; } var one = new man (); Console.log (One.Feature); // ['jenggot', 'kuat'] console.log (one.hair); // black console.log (satu.eye); // black console.log (One.skin); // yellow console.log (one.view ()); // Hitam, hitam, kuningCatatan: Jika parameter Apply kosong, yaitu, tidak ada parameter yang dilewati, itu akan dilewatkan melalui array baru () dan [], dan nol tidak valid.
Tipe ketiga adalah panggilan+prototipe:
// Ketua Function Function Person () {this.hair = 'black'; this.eye = 'hitam'; this.skin = 'yellow'; this.view = function () {return this.hair + ',' + this.eye + ',' + this.skin; }} // subkelas fungsi man () {// person.apply (ini, array baru ()); person.call (ini, []); this.feature = ['jenggot', 'kuat']; } man.prototype = orang baru (); var one = new man (); Console.log (One.Feature); // ['jenggot', 'kuat'] console.log (one.hair); // black console.log (satu.eye); // black console.log (One.skin); // yellow console.log (one.view ()); // Hitam, hitam, kuningMekanisme implementasi metode panggilan membutuhkan satu orang lagi.prototype = orang baru (); Mengapa?
Itu karena metode panggilan hanya mengimplementasikan penggantian metode dan tidak menyalin atribut objek.
Inilah yang diwariskan API Google Map.
Di atas merangkum implementasi tiga metode warisan. Tetapi setiap metode memiliki kelebihan dan kekurangannya.
Jika kelas induk seperti ini:
// orang fungsi kelas induk (rambut, mata, kulit) {this.hair = rambut; this.eye = mata; this.skin = kulit; this.view = function () {return this.hair + ',' + this.eye + ',' + this.skin; }}Bagaimana seharusnya subkelas dirancang sehingga subkelas manusia memberikan parameter kepada orang tua kelas orang saat membuat objek. Metode warisan prototipe tidak berlaku.
Anda harus menggunakan metode Apply atau Call:
// terapkan metode // Fungsi subkelas pria (rambut, mata, kulit) {person.Apply (ini, [rambut, mata, kulit]); this.feature = ['jenggot', 'kuat']; } // Metode panggilan // Fungsi subkelas pria (rambut, mata, kulit) {person.call (ini, rambut, mata, kulit); this.feature = ['jenggot', 'kuat']; }Tetapi masih ada kelemahan untuk menggunakan metode Apply. Mengapa? Di JS, kami memiliki operator yang sangat penting, yang merupakan "contoh", yang digunakan untuk membandingkan apakah arah yang berlawanan dari jenis tertentu.
Untuk contoh ini, selain menjadi tipe pria, satu contoh juga harus menjadi tipe orang. Namun, setelah mewarisi metode Apply, seseorang bukan milik tipe orang, yaitu, nilai (satu contoh orang) salah.
Setelah semua ini, cara terbaik untuk mewarisi adalah metode panggilan+prototipe. Setelah itu, Anda dapat mencoba apakah nilai (satu contoh baseclass) benar.
Metode warisan ketiga juga memiliki kelemahan: ketika subklassing objek baru, Anda harus melewati parameter yang dibutuhkan oleh kelas induk, dan properti dan metode dalam kelas induk akan direproduksi. Metode warisan berikut sempurna:
function person (name) {this.name = name; } Person.prototype.getName = function () {return this.name; } function cina (name, nation) {person.call (this, name); this.nation = nation; } // Metode mewarisi fungsi warisan (subklass, superclass) {function f () {} f.prototype = superclass.prototype; subclass.prototype = new f (); subclass.prototype.constructor = subclass.constructor; } warisan (Cina, orang); Chiese.prototype.getNation = function () {return this.nation; }; var p = orang baru ('shijun'); var c = Cina baru ("liyatang", "Cina"); console.log (p); // orang {name: "shijun", getName: function} console.log (c); // cina {name: "liyatang", nation: "china", konstruktor: fungsi, getNation: function, getName: function} console.log (p.constructor); // function person (name) {} console.log (c.constructor); // function chines () {} console.log (c instance dari Cina); // true console.log (c instance dari orang); // BENARArtikel di atas secara singkat membahas tiga metode warisan dan kelebihan serta kerugiannya di JS. Ini semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.