Sebelum memulai kode, Anda harus memahami dengan jelas apa tujuan warisan dan manfaat apa yang dapat dibawa. Secara umum, saat merancang kelas, kami berharap dapat mengurangi kode duplikat dan melemahkan kopling antar kelas. Sulit untuk menjaga keduanya. Menurut pemahaman kita tentang warisan bahasa wajah -untuk -objek, warisan akan membawa kopling kuat langsung, tetapi karena fleksibilitasnya yang unik, JS dapat merancang kode kopling yang kuat dan kopling yang lemah, efisiensi tinggi dan kode yang tidak efisien. Dan apa yang Anda gunakan tergantung pada situasinya.
Berikut ini memberikan tiga metode warisan dalam JS: Kelas Warisan, pewarisan prototipe, dan pencampuran. Berikut adalah deskripsi singkat tentang warisan kelas.
Warisan bentuk kelas.
Realisasi warisan jenis JS tergantung pada rantai prototipe. Apa rantai aslinya? Objek dalam JS memiliki prototy atribut.
Tampaknya memiliki kesan prototipe.
Salin kode kode sebagai berikut:
var person = function () {
this.name = "liyatang";
};
Person.prototype = {
// Anda dapat memberikan fungsi dasar orang di sini
getName: function () {
Kembalikan nama ini;
}
}
Kami menempatkan fungsi dasar kelas di properti prototipe, menunjukkan bahwa referensi objek orang memiliki fungsi XXX.
Setelah memahami prototipe, Anda perlu memahami apa rantai aslinya. Ketika anggota (atribut atau metode) dari objek kunjungan, jika anggota tidak terlihat pada objek saat ini, maka JS akan menemukannya di objek yang dirujuk dalam atribut prototipe. Jika tidak ditemukan, itu akan kembali ke tidak sesuai.
Jadi petunjuk apa yang diberikan rantai asli kepada kita? Sangat mudah untuk berpikir bahwa rantai utama berarti untuk memungkinkan satu kelas mewarisi kelas lain. Ini mengikat anggota kelas induk ke sub -kelas, karena mereka akan menemukan kelas induk ketika mereka tidak ditemukan di subkelas. (Dua paragraf kata -kata di atas tidak ketat, hanya dijelaskan dalam kata -kata mudah -untuk -memahami)
Di bawah ini kita membutuhkan kelas Cina, dan kita perlu mewarisi nama dan mendapatkan anggota kelas kelas orang.
Salin kode kode sebagai berikut:
Var cina = function (name, nation) {
// warisan, Anda perlu memanggil konstruktor kelas induk, Anda dapat menyebutnya dengan panggilan, titik ini ke Cina
// orang dapat memanggil anggota orang dalam ruang lingkup ini
Person.call (ini, nama);
this.nation = nasional;
};
Cina.prototype = person.prototype;
// Ini tidak sama seperti sebelumnya, karena atribut prototipe tertutup
//Chinese.prototype = {
// getNation: function () {{
// kembalikan ini.
//}
//};
// Jalan di masa depan perlu ditambahkan seperti ini
Chines.Prototype.getNation = function () {
Kembalikan ini.nation;
};
Hubungan warisan ditetapkan, kami menyebutnya seperti ini
Salin kode kode sebagai berikut:
var c = Cina baru ("liyatang", "Cina");
waspada (c.getname ());
Jadi warisan jenisnya selesai. Apakah itu benar -benar selesai?
Ini karena kode di atas cina.prototype = person.prototype; ini adalah jenis referensi, dan orang Cina juga dimodifikasi orang. Ini tidak ditoleransi dengan sendirinya, dan itu bukan efek yang kita inginkan.
Kita dapat melemahkan kopling di objek atau instance lain.
Salin kode kode sebagai berikut:
//
//Chinese.prototype = orang baru ();
// tipe kedua
// var f = function () {};
//F.prototype = person.prototype;
//Chinese.prototype = f.prototype;
Apa perbedaan antara kedua metode ini? Tambahkan fungsi kosong F pada tipe kedua, yang dapat menghindari contoh pembuatan kelas induk, karena kelas induk mungkin besar, dan fungsi struktur kelas induk akan memiliki beberapa efek samping, atau sejumlah besar perhitungan akan dilakukan. Jadi rekomendasikan metode kedua.
Pada titik ini, ini sudah berakhir, belum! Ada atribut atribut atribut objek, yang mempertahankan referensi ke fungsi instance objek tertentu. Menurut pernyataan ini, Chiese.prototype.constructor harus sama dengan Cina, yang sebenarnya tidak.
Ketika rantai prototipe Chiese diatur sebelum ingatan, kami menutupi orang tersebut. Prototipe dari Chiese.prototype. Jadi saat ini, Chiese.prototype.constructor adalah orang. Kami juga perlu menambahkan kode berikut
Salin kode kode sebagai berikut:
// Tidak perlu menyelidiki kondisi IF di sini, mengetahui cina.prototype.constructor = Cina
If (chiese.prototype.constructor == object.prototype.constructor) {
Cina.prototype.constructor = Cina;
}
Berubah menjadi seluruh kode sebagai berikut
Salin kode kode sebagai berikut:
var person = function (name) {
this.name = name;
};
Person.prototype = {
getName: function () {
Kembalikan nama ini;
}
};
Var cina = function (name, nation) {
Person.call (ini, nama);
this.nation = nasional;
};
var f = function () {};
F.prototype = person.prototype;
China.prototype = f.prototype;
If (chiese.prototype.constructor == object.prototype.constructor) {
Cina.prototype.constructor = Cina;
}
Chines.Prototype.getNation = function () {
Kembalikan ini.nation;
};
var c = Cina baru ("liyatang", "Cina");
alert (c.getname ());
Jika Anda dapat meletakkan kode warisan dalam suatu fungsi, lebih mudah bagi kode untuk digunakan kembali, dan yang terakhir menyortir kode adalah sebagai berikut
Salin kode kode sebagai berikut:
Function Extend (Subclass, SuperClass) {{
var f = function () {};
F.prototype = superclass.prototype;
subclass.prototype = new f ();
subclass.prototype.constructor = subclass;
Subclass.SuperClass = superclass.prototype;
If (superclass.prototype.constructor == object.prototype.constructor) {
superclass.prototype.constructor = superclass;
}
}
var person = function (name) {
this.name = name;
};
Person.prototype = {
getName: function () {
Kembalikan nama ini;
}
};
Var cina = function (name, nation) {
Person.call (ini, nama);
this.nation = nasional;
};
memperluas (Cina, orang);
Chines.Prototype.getNation = function () {
Kembalikan ini.nation;
};
var c = Cina baru ("liyatang", "Cina");
alert (c.getname ());
Modifikasi setelah publikasi:
Di bawah komentar di lantai pertama, saya memiliki tampilan baru tentang fungsi perpanjangan itu. Dua metode diusulkan saat membahas cara mengatur rantai aslinya
Salin kode kode sebagai berikut:
//
//Chinese.prototype = orang baru ();
// tipe kedua
// var f = function () {};
//F.prototype = person.prototype;
//Chinese.prototype = f.prototype;
Meskipun cara kedua untuk mengurangi fungsi konstruksi kelas induk, orang tersebut.
Namun, dalam metode pertama, Anda dapat mengurangi orang tersebut. Call (ini, nama) dalam bahasa Cina; Mungkin ingin menempatkan kode fungsi ini dalam perpanjangan. Tulis saja
China.prototype = orang baru (); juga mencapai tujuan yang sama: bukan kopling yang kuat.
Tetapi kelupaannya adalah cina.prototype = orang baru (); Jawabannya salah! Jelas orang baru () perlu melewati parameter nama. Kami tidak dapat melakukan bagian ini dari fungsi Perluas, jadi kami harus memanggil konstruktor kelas induk di kelas Cina. Ini juga sejalan dengan ide yang berorientasi objek.
Oleh karena itu, masih disarankan untuk menggunakan metode kedua.
Pertama kali saya menulis tentang artikel teknis dengan cara ini, pada dasarnya itu diaspal menurut pemikiran saya sendiri.