Kaedah simulasi JavaScript untuk melaksanakan kemahiran inheritance_javascript

WBOY
Lepaskan: 2016-05-16 16:06:56
asal
1177 orang telah melayarinya

Contoh dalam artikel ini menerangkan kaedah simulasi JavaScript untuk melaksanakan pewarisan. Kongsikan dengan semua orang untuk rujukan anda. Analisis khusus adalah seperti berikut:

Kita semua tahu bahawa JavaScript hanya boleh mensimulasikan dan melaksanakan "kelas" dalam OO, yang bermaksud bahawa tiada pewarisan kelas dalam JavaScript. Kami hanya boleh mensimulasikan pelaksanaan dengan menambah atau menulis semula atribut dalam objek asal.

Tentukan kelas induk dahulu,

//父类
function ParentClass() {
 this.className = "ParentClass";
 this.auth = "Auth";
 this.version = "V1.0";
 this.parentClassInfo = function () {
 return this.className + "\n" + this.auth + "\n" + this.version;
 }
}
Salin selepas log masuk

1. Pelaksanaan prototaip:

//子类
//1、prototype继承
function ChildClassByPrototype() {
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
ChildClassByPrototype.prototype = new ParentClass();
var cctest1 = new ChildClassByPrototype();
cctest1.parentClassInfo();
cctest1.classInfo();
Salin selepas log masuk

Kaedah ini sangat mudah, hanya tetapkan contoh kelas induk kepada atribut prototaip subkelas, dan kemudian subkelas boleh menggunakan kaedah dan atribut bapa. Di sini kita sebenarnya menggunakan ciri mencari ke atas dalam rantaian prototaip, seperti kaedah cctest1.parentClassInfo() dalam contoh ini JavaScript akan terlebih dahulu mencari kaedah parentClassInfo() dalam contoh ChildClassByPrototype , jadi ia terus mencari sifat prototaip ChildClassByPrototype, dan nilai sifat prototaipnya ialah contoh ParentClass, yang mempunyai kaedah parentClassInfo(), jadi carian tamat dan panggilan berjaya.

2. Gunakan pelaksanaan:

//2、apply继承
function ChildClassByApply() {
 ParentClass.apply(this, new Array());
 //ParentClass.apply(this, []);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
Salin selepas log masuk

Gunakan dalam JavaScript boleh difahami sebagai menggantikan kaedah B dengan kaedah A. Parameter pertama ialah objek kaedah B itu sendiri, dan parameter kedua ialah tatasusunan Nilai dalam tatasusunan ialah parameter yang perlu dihantar ke kaedah A. Senarai, jika parameter kosong, iaitu, tiada parameter diluluskan, ia boleh dihantar melalui Array(), [].

3. Pelaksanaan prototaip panggilan:

//3、call+prototype继承
function ChildClassByCall() {
 ParentClass.call(this, arguments);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
ChildClassByCall.prototype = new ParentClass();
Salin selepas log masuk

Panggil dan gunakan mempunyai fungsi yang serupa, iaitu, kedua-duanya menggantikan kaedah B dengan kaedah A, tetapi parameter yang diluluskan adalah berbeza Parameter pertama kaedah panggilan ialah objek kaedah B itu sendiri, dan parameter seterusnya tidak diperlukan untuk dibungkus dalam Array dan perlu dihantar terus mengikut urutan. Oleh kerana fungsinya hampir sama, mengapakah terdapat ayat tambahan penugasan prototaip? Ini kerana kaedah panggilan hanya melaksanakan penggantian kaedah dan tidak menyalin atribut objek.

Setiap kaedah mempunyai persekitaran yang berkenaan, contohnya, jika kelas induk mempunyai pembina berparameter:

function ParentClass(className, auth, version) {
 this.className = className;
 this.auth = auth;
 this.version = version;
 this.parentClassInfo = function () {
 return this.className + "\n" + this.auth + "\n" + this.version;
 }
}
Salin selepas log masuk

Dalam kes ini, prototaip tidak berkenaan, dan memohon atau memanggil boleh digunakan

function ChildClassByApply(className, auth, version) {
 ParentClass.apply(this, [className, auth, version]);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
function ChildClassByCall(className, auth, version) {
 ParentClass.call(this, arguments[0], arguments[1], arguments[2]);
 //ParentClass.call(this, className, auth, version);
 this.date = "2013-07-26";
 this.classInfo = function () {
  return this.parentClassInfo() + "\n" + this.date;
 }
}
ChildClassByCall.prototype = new ParentClass();
Salin selepas log masuk

Instansiasi:

var cctest2 = new ChildClassByApply("ParentClass", "Auth", "V1.0");
var cctest3 = new ChildClassByCall("ParentClass", "Auth", "V1.0");
Salin selepas log masuk

Bagaimana untuk memilih antara memohon dan menelefon? Dalam warisan OO, subkelas mewarisi daripada kelas induk, jadi ia juga harus menjadi jenis kelas induk. Iaitu, ChildClassByCall dan ChildClassByApply juga harus daripada jenis ParentClass, tetapi jika kita menggunakan "instanceof" untuk mengesannya, kita akan mendapati bahawa subkelas yang diwarisi melalui apply bukan jenis ParentClass. Oleh itu, kami mengesyorkan menggunakan prototaip panggilan untuk mensimulasikan warisan. Dikatakan warisan Google Map API menggunakan kaedah ini.

Saya harap artikel ini akan membantu reka bentuk pengaturcaraan JavaScript semua orang.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan