Sebagai bahasa yang berorientasi objek (JS berbasis objek), penting untuk mengimplementasikan pewarisan, tetapi karena tidak ada konsep kelas itu sendiri, ia tidak akan menerapkan warisan melalui kelas-kelas seperti bahasa pemrograman yang berorientasi objek nyata, tetapi dapat menerapkan warisan melalui metode lain. Ada banyak cara untuk menerapkan warisan, dan berikut ini hanyalah beberapa dari mereka.
1. Prototipe Rantai Warisan
function person () {// Fungsi yang diwariskan disebut supertype (kelas induk, kelas dasar) this.name = 'mumu'; this.age = '18 '; } Person.prototype.name = 'susu'; // Ketika nama atributnya sama, Anda harus terdekat, cari dalam contoh terlebih dahulu, tetapi kemudian pergi ke prototipe untuk menemukan pekerja fungsi () {// Fungsi yang diwariskan disebut subtipe (subclass, kelas yang diturunkan) this.job = 'student'; } Worker.prototype = orang baru (); // Diwarisi melalui rantai prototipe, instance objek yang dipasang oleh supertype ditugaskan ke atribut prototipe dari subclass var p2 = pekerja baru (); console.log (p2.name); console.log (p2 instance dari objek); // ture semua konstruktor diwarisi dari objekKunci untuk menerapkan warisan di atas adalah: worker.prototype = orang baru (); Jadikan prototipe pekerja sebagai instance orang dan mewarisi melalui rantai prototipe.
Catatan: Saat menggunakan rantai prototipe untuk mengimplementasikan pewarisan, Anda tidak dapat menggunakan literal objek untuk membuat metode prototipe, karena ini akan mengganggu hubungan dan menulis ulang rantai prototipe.
Masalah warisan rantai prototipe:
1. Ada masalah berbagi referensi, dan mereka masih berbagi ruang yang sama, dan subclass akan mempengaruhi kelas induk.
function person () {this.bodys = ['eye', 'foot']; } function worker () {} worker.prototype = orang baru (); var p1 = pekerja baru (); p1.bodys.push ('hand'); var p2 = pekerja baru (); console.log (p1.bodys); console.log (p2.bodys);2. Saat membuat instance subtipe, parameter tidak dapat dilewati dalam konstruktor supertype.
Jadi bagaimana menyelesaikan dua masalah rantai prototipe? Kemudian terus lihat metode warisan di bawah ini ~
2. Pinjaman pinjaman pewarisan (juga disebut peniruan objek, objek yang dipalsukan atau warisan klasik)
function person (name, use) {this.name = name; this.age = usia; this.bodys = ['eye', 'foot']; } Person.prototype.showname = function () {console.log (this.name); } function worker (nama, usia, pekerjaan) {person.call (ini, nama, usia); this.job = job; // subkelas menambahkan atribut} var p1 = pekerja baru ('mumu', '18', 'siswa'); p1.bodys.push ('hand'); var p2 = pekerja baru (); console.log (p1.name); console.log (p2.bodys); console.log (p1.showname ());Analisis singkat tentang prinsip di atas menggunakan konstruktor yang dipinjam: Person.Call (ini, nama, usia); Kode ini memanggil konstruktor induk, mewarisi atribut induk, dan menggunakan metode panggilan untuk memanggil orang konstruktor untuk mengubah ini ketika fungsi dieksekusi. Di sini, ini-> baru adalah metode penyamaran objek pekerja yang disamarkan: Lewati pekerja kepada orang di atas.
Ketika jenis referensi ditempatkan di konstruktor, itu tidak akan dibagikan, jadi P2 tidak terpengaruh.
Meminjam metode warisan konstruktor di sini memecahkan masalah bahwa rantai prototipe tidak dapat melewati parameter dan berbagi jenis referensi.
Tips: Call () dan Metode Terapkan () dapat mengubah ruang lingkup eksekusi fungsi, singkatnya, ubah konten yang ditunjukkan oleh fungsi ini.
Baik call () dan apply () menerima dua parameter: yang pertama adalah ruang lingkup fungsi yang berjalan di dalamnya, dan yang lainnya adalah parameter yang diteruskan.
Perbedaan antara panggilan dan berlaku adalah perbedaan parameter.
Parameter dalam panggilan harus disebutkan satu per satu.
Parameter dalam berlaku harus array atau argumen objek
Jadi pertanyaannya adalah: mengapa hasil dari p1.showname () salah? ---- Karena metode warisan pinjaman konstruktor hanya dapat mewarisi atribut dan metode dalam konstruktor. Di sini kami juga menemukan masalah pinjaman konstruktor.
Catatan: Karena kami menempatkan semua metode di konstruktor, setiap kali kami instantiate, kami akan mengalokasikan ruang memori untuk membuang sumber daya, jadi kami biasanya memasukkan metode dalam prototipe dan atribut dalam konstruktor.
Meminjam Masalah Warisan Konstruktor:
Karena meminjam konstruktor hanya dapat mewarisi sifat dan metode dalam konstruktor, metode yang didefinisikan dalam prototipe supertype tidak terlihat oleh subkelas, sehingga setara dengan tidak memiliki prototipe. Akibatnya, semua metode hanya dapat didefinisikan dalam konstruktor, sehingga tidak ada fungsi multiplexing.
Jadi bagaimana menyelesaikan masalah yang disebabkan oleh konstruktor pinjaman? Maka itu tergantung pada metode warisan berikut
3. Kombinasi warisan (pseudo-klasik warisan)
function person (name, use) {this.name = name; this.age = usia; } Person.prototype.showname = function () {console.log (this.name); } function worker (nama, usia, pekerjaan) {person.call (ini, nama, usia); // pinjam konstruktor this.job = job; } Worker.prototype = orang baru (); // prototipe rantai pewarisan var p1 = pekerja baru ('mumu', '18', 'siswa'); console.log (p1.age); p1.showname ();Kombinasi Warisan: Menggabungkan rantai prototipe dengan konstruktor yang dipinjam.
Ide: Dengan menggunakan rantai prototipe untuk mengimplementasikan warisan atribut dan metode pada prototipe, dan dengan meminjam konstruktor untuk mengimplementasikan warisan atribut instance
Contoh orang di atas.call (ini, nama, usia); meminjam konstruktor untuk mewarisi atribut
Worker.prototype = orang baru (); rantai prototipe mewarisi metode ini, menghindari kekurangan keduanya, menggabungkan keunggulan mereka, dan menjadi model warisan yang paling umum digunakan.
Kombinasi Masalah Warisan:
Konstruktor supertype dipanggil dua kali, sekali saat membuat prototipe subtipe dan waktu lain di dalam konstruktor subtipe.
Untuk mengatasi masalah ini, kita harus menggunakan pewarisan kombinasi parasit.
4. Prototipe warisan
objek fungsi (proto) {function f () {} f.prototype = proto; mengembalikan f baru (); } var person = {name: 'mumu', friends: ['xiaxia', 'susu']}; var OtherPerson = objek (orang); OtherPerson.Friends.push ('Wen'); var yeyntanotherperson = objek (orang); OtherPerson.Friends.push ('tian'); console.log (person.friends); // ["xiaxia", "susu", "wen", "tian"] console.log (Anotherperson .__ proto __) // objek {nama: "mumu", teman: array [4]}Analisis singkat: Objek Fungsi (Proto) adalah fungsi relai sementara, parameter proto di dalamnya mewakili objek yang akan diteruskan. Konstruktor f () adalah objek sementara yang baru dibuat, yang digunakan untuk menyimpan objek yang dilewati. F.prototype = proto; Tetapkan instance objek ke objek prototipe konstruktor F, dan akhirnya mengembalikan instance objek dari objek yang ditularkan. Prototipe warisan atau atribut berbagi jenis referensi.
5. Warisan Parasit
// objek fungsi transit sementara (proto) {function f () {} f.prototype = proto; mengembalikan f baru (); } // fungsi parasit create (proto) {var f = objek (proto); f.love = function () {return this.name; } return f; } var person = {name: 'mumu', friends: ['xiaxia', 'susu']}; var OtherPerson = create (orang); console.log (lainPerson.love ()); Warisan kombinasi parasit6. Warisan Kombinasi Parasit
objek fungsi (proto) {function f () {} f.prototype = proto; mengembalikan f baru (); } // fungsi fungsi parasit membuat (orang, pekerja) {var f = object (person.prototype); // Buat objek f.constructor = pekerja; // Sesuaikan pointer konstruksi prototipe dan tingkatkan pekerja objek.prototype = f; // Tentukan objek} fungsi orang (nama, usia) {name.name = name; this.age = usia; } Person.prototype.showname = function () {console.log (this.name); } function worker (nama, usia, pekerjaan) {person.call (ini, nama, usia); this.job = pekerjaan; } create (orang, pekerja); // Kombinasi Parasit Warisan var p1 = orang baru ('mumu', '18', 'siswa'); p1.showname ();Metode ini juga merupakan cara paling sempurna dan ideal untuk menerapkan metode warisan sekarang.
Catatan pembelajaran warisan JavaScript di atas [harus dibaca untuk pemula] adalah semua konten yang dibagikan oleh editor. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.