Warisan di js dapat dibagi menjadi dua jenis: peniruan identitas objek dan rangkaian prototipe.
1. Peniruan identitas objek mencakup tiga jenis : metode atribut sementara, metode call() dan apply()
1. Metode atribut sementara
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
ini.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
}
fungsi F2E(nama,id){
this.temp = Orang;
this.temp(nama);
hapus this.temp;
ini.id = id;
ini.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
}
var simon = F2E baru('Simon',9527);
simon.say();
simon.showId();
2.panggilan()/metode apply()
Pada dasarnya, ini mengubah penunjuk penunjuk ini.
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
ini.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
}
fungsi F2E(nama,id){
Person.call(ini,nama); //apply() metode diubah menjadi Person.apply(ini, Array baru(nama));
ini.id = id;
ini.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
}
var simon = F2E baru('Simon',9527);
simon.say();
simon.showId();
Kekurangan: Pertama mari kita lihat diagram alokasi memori ini:
Dalam konsep OO, setelah new dipakai, objek membentuk ruangnya sendiri di memori heap. Perlu dicatat bahwa segmen kode ini. Metode anggota ada di segmen kode ini, dan metode tersebut dibagikan. Masalahnya ada di sini. Saat mewarisi melalui peniruan identitas objek, semua metode anggota menunjukkan hal ini. Artinya, setelah new, setiap instance akan memiliki metode anggota ini, yang tidak dibagikan, yang mengakibatkan banyak memori terbuang. Dan melalui peniruan identitas objek, variabel dan metode yang ditentukan melalui prototipe tidak dapat diwarisi. Misalnya, kode berikut akan menyebabkan kesalahan:
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
ini.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
}
Orang.prototipe.usia = 20;
Person.prototype.sayAge = function(){alert('Usia saya '+ini.usia)};
fungsi F2E(nama,id){
Person.apply(ini, Array baru(nama));
ini.id = id;
ini.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
}
var simon = F2E baru('Simon',9527);
simon.sayAge(); //Prompt TypeError: simon.sayAge bukan sebuah fungsi
2. Metode rantai prototipe
Copy kode kodenya sebagai berikut:
fungsi Orang(){
this.nama = 'Simon';
}
Orang.prototipe.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
fungsi F2E(id){
ini.id = id;
ini.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
}
F2E.prototipe = Orang baru();
var simon = F2E baru(9527);
simon.say();
simon.showId();
alert(simon.hasOwnProperty('id')); //Periksa apakah itu milik sendiri
Selanjutnya, ikuti contoh di atas untuk memahami konsep rantai prototipe js berikut:
Rantai prototipe dapat dipahami sebagai: setiap objek di js memiliki atribut __proto__ yang tersembunyi. Atribut __proto__ dari objek yang dipakai menunjuk ke metode prototipe dari kelasnya, dan metode prototipe ini dapat ditugaskan ke Objek lain, __proto__ dari objek ini perlu menunjuk ke kelasnya, sehingga membentuk sebuah rantai, yaitu
Copy kode kodenya sebagai berikut:
F2E.prototipe = Orang baru()
Kalimat ini adalah kuncinya. Ketika objek js membaca atribut tertentu, ia akan mencari atributnya terlebih dahulu, jika tidak ada atribut, maka ia akan mencari atribut objek tersebut pada rantai prototipe. Dengan kata lain, metode rantai prototipe dapat dibagikan, yang memecahkan masalah peniruan identitas objek dan pemborosan memori.
Sekarang mari kita bicara tentang kerugiannya:
Kerugiannya jelas. Warisan rantai prototipe berarti bahwa parameter tidak dapat diteruskan ke kelas induk saat membuat instance subkelas. Inilah sebabnya fungsi Person() dalam contoh ini tidak memiliki parameter dan langsung ditulis sebagai this.name="Simon". Kode berikut tidak akan mencapai efek yang diinginkan:
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
}
Orang.prototipe.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
fungsi F2E(nama,id){
ini.id = id;
ini.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
}
F2E.prototipe = Orang baru();
var simon = F2E baru("Simon",9527);
simon.say();
simon.showId();
fungsi Orang(nama){
ini.nama = nama;
}
Orang.prototipe.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
fungsi F2E(nama,id){
ini.id = id;
ini.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
}
F2E.prototype = new Person(); //Nilai tidak dapat diteruskan di sini, baik this.name maupun name tidak akan berfungsi. say( ) menjadi Namaku kayu
var simon = F2E baru("Simon",9527);
simon.say(); //Pop up Nama saya tidak terdefinisi
simon.showId();
Terakhir, izinkan saya meringkas apa yang menurut saya merupakan cara yang lebih baik untuk mengimplementasikan pewarisan. Variabel anggota menggunakan peniruan identitas objek, dan metode anggota menggunakan rangkaian prototipe. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
}
Orang.prototipe.katakan = fungsi(){
alert('Nama saya '+nama ini);
}
fungsi F2E(nama,id){
Orang.panggilan(ini,nama);
ini.id = id;
}
F2E.prototipe = Orang baru();
//Perhatikan satu detail di sini, showId tidak dapat ditulis di depan F2E.prototype = new Person();
F2E.prototipe.showId = fungsi(){
alert('Selamat pagi Pak,Nomor kantor saya '+ini.id);
}
var simon = F2E baru("Simon",9527);
simon.say();
simon.showId();