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; } }
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();
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; } }
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();
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; } }
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();
Instansiasi:
var cctest2 = new ChildClassByApply("ParentClass", "Auth", "V1.0"); var cctest3 = new ChildClassByCall("ParentClass", "Auth", "V1.0");
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.