การพูดถึงการสืบทอดคลาสของ JavaScript มันเป็นสิ่งที่หลีกเลี่ยงไม่ได้ที่ห่วงโซ่ต้นแบบไม่สามารถแยกออกได้ แต่การสืบทอดผ่านห่วงโซ่ต้นแบบมีข้อบกพร่องมากมาย
ปัญหาการสืบทอดที่ไม่มีพารามิเตอร์
ก่อนอื่นให้ดูที่โค้ดตัวอย่างเพื่อใช้งานมรดก B จาก A:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน A () {
-
A.prototype.a1 = function () {};
ฟังก์ชั่น b () {
-
b.prototype = new a ();
b.prototype.b1 = function () {};
var b = new b ();
การแจ้งเตือน (b.Constructor == a); // จริง
การแจ้งเตือน (B.Constructor == B); // เท็จ
ปัญหาหลักของรหัสนี้คือ:
1. A จำเป็นต้องมีการสร้างอินสแตนซ์เป็นต้นแบบของ B และตัวสร้างของ A จะถูกดำเนินการในเวลานี้ อย่างไรก็ตามตามกฎที่มุ่งเน้นวัตถุ B และคลาสแม่ A ไม่ควรดำเนินการก่อนที่จะอินสแตนซ์ B.
2. เปลี่ยนต้นแบบของ B ส่งผลให้ B.Constructor ไม่ใช่ B แต่ A.
มีปัญหาเกี่ยวกับการสืบทอดการสืบทอดระดับโสม
สมมติว่า A และ B มีพารามิเตอร์สตริงสองตัว S1 และ S2 A คำนวณความยาวทั้งหมดของสองสายและ B เรียกโดยตรงกับ S1 และ S2 เป็นพารามิเตอร์:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น A (S1, S2) {
this.totallength = s1.length + s2.length;
-
A.prototype.a1 = function () {
-
ฟังก์ชัน B (S1, S2) {
-
b.prototype = new a ();
b.prototype.b1 = function () {
-
ใหม่ B ("AB", "123");
อย่างที่คุณเห็นไม่มีวิธีที่จะผ่าน S1 และ S2 ไปยัง A ในรหัสนี้และเนื่องจากไม่มีพารามิเตอร์เมื่ออินสแตนซ์ A เป็นต้นแบบของ B จึงมีข้อยกเว้นเกิดขึ้น:
การคัดลอกรหัสมีดังนี้:
S1 ไม่ได้กำหนด
สารละลาย
ขอบเขตของ S1 และ S2 เป็นเพียงใน B เพื่อส่งผ่านไปยัง A คุณสามารถใช้งานได้ใน B. สามารถทำได้โดยใช้วิธีการใช้งานของฟังก์ชั่น:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน B (S1, S2) {
A. ใช้ (ข้อโต้แย้งนี้);
การแจ้งเตือน (this.totallength);
-
คำถามต่อไปคือวิธีเพิ่มวิธี A ไปยังต้นแบบ B นี่ไม่ใช่เรื่องยากเพียงแค่ผ่าน A.Prototype และคัดลอกวิธีการไปยัง B.Prototype ควรสังเกตว่าสำหรับวิธีการที่มีชื่อเดียวกัน subclasses เป็นที่ต้องการตามธรรมชาติ (overloaded) ดังนั้นพวกเขาจึงไม่สามารถถูกแทนที่ได้:
การคัดลอกรหัสมีดังนี้:
สำหรับ (var m ใน a.prototype) {
if (! b.prototype [m]) {// วิธีการของคลาสแม่ไม่สามารถแทนที่คลาสย่อย
b.prototype [m] = a.prototype [m];
-
-
postscript
เมื่อพิจารณาว่าภาษาระดับสูงเช่น C# และ Java ได้ละทิ้งมรดกหลายครั้งสถานการณ์ของการสืบทอดเดี่ยวจะถูกกล่าวถึงในบทความนี้ วิธีการสืบทอดที่อธิบายไว้ในบทความนี้จะถูกเขียนเป็นส่วนขยายของ Jraiser และจะได้รับการปล่อยตัวในภายหลัง