ไม่จำเป็นต้องพูดวิธีนี้ค่อนข้างเข้าใจง่ายเรียกตัวสร้างของคลาสแม่ในคลาสย่อย นอกจากนี้หนึ่งในข้อได้เปรียบที่ใหญ่ที่สุดของวิธีนี้คือการสร้างมรดกสามารถบรรลุหลายมรดก ตรวจสอบรหัสนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น A ()
-
ฟังก์ชั่น B ()
-
ฟังก์ชั่น C ()
-
this.father = a;
this.father ();
ลบสิ่งนี้พ่อ;
this.father = b;
this.father ();
ลบสิ่งนี้พ่อ;
-
แต่วิธีนี้ก็มีสิ่งนี้และข้อเสียนั้น:
หากคุณคุ้นเคยกับวัตถุที่มุ่งเน้นลองดูที่รหัส C# นี้:
การคัดลอกรหัสมีดังนี้:
โปรแกรมชั้นเรียน
-
StaticVoid Main (String [] args)
-
b b = newb ();
bool temp = (typeof (a)). isinstanceoftype (b);
Console.WriteLine (TEMP);
-
-
ชั้นเรียน
-
สาธารณะ ()
-
-
-
Classb: A
-
สาธารณะ B ()
-
-
-
ผลลัพธ์คืออะไร? B เป็นตัวอย่างของ A:
อย่างไรก็ตามเราทำการทดสอบนี้ในส่วนด้านบนของรหัส JavaScript ที่สืบทอดมาโดยใช้โครงสร้าง:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น A ()
-
ฟังก์ชั่น B ()
-
ฟังก์ชั่น C ()
-
this.father = a;
this.father ();
ลบสิ่งนี้พ่อ;
this.father = b;
this.father ();
ลบสิ่งนี้พ่อ;
-
var c = new C ();
การแจ้งเตือน (c อินสแตนซ์ของ A);
แต่ผลลัพธ์ไม่ใช่สิ่งที่เราจินตนาการ:
ในความเป็นจริงมันเป็นเรื่องง่ายที่จะอธิบาย: การสร้างมรดกที่สร้างขึ้นเป็นเพียงคุณสมบัติของชั้นเรียนหลักที่คัดลอกโดยการเรียกวิธีการก่อสร้างของชั้นพาเรนต์ ไม่มีการค้นหาอื่น ๆ วัสดุจำนวนมากไม่เรียกวิธีการถ่ายทอดทางมรดกนี้
ในขณะที่เห็นข้อบกพร่องโปรดจำไว้ว่าข้อดี: สนับสนุนการสืบทอดเพิ่มเติม
เมื่อเราดูมรดกของ C# เราพบว่ามีความแตกต่างทั่วไปสองประการจากการสืบทอดนี้: C# ไม่สนับสนุนการสืบทอดหลายครั้งและข้อเสียของการสืบทอดเชิงสร้างสรรค์ที่ฉันกล่าวถึงข้างต้น ดังนั้นวิธีการสืบทอดใหม่จึงถูกสร้างขึ้นและเรากลายเป็นมรดกต้นแบบ
เมื่อคุณเห็นชื่อคุณสามารถเข้าใจได้อย่างคร่าวๆว่าการสืบทอดต้นแบบคือการใช้คุณสมบัติของต้นแบบเพื่อให้ได้มรดก นี่เป็นวิธีการสืบทอดที่ได้รับความนิยมมากที่สุดใน JavaScript หากคุณไม่เข้าใจต้นแบบโปรดให้ความสนใจกับบทความอื่นของฉัน: "เล่นกับต้นแบบ - ต้นแบบ"
มาดูรหัสก่อน ที่นี่ฉันจะวาดส่วนหนึ่งของรหัสจาก "The Return of the King of JavaScript"::
การคัดลอกรหัสมีดังนี้:
จุดฟังก์ชัน (มิติ)
-
สิ่งนี้มิติ = มิติ;
this.test = function () {
การแจ้งเตือน ("ความสำเร็จ");
-
-
ฟังก์ชั่น point2d (x, y)
-
this.x = x;
this.y = y;
-
point2d.prototype = จุดใหม่ (2);
var p = new point2d (3,4);
p.test ();
การทดสอบผ่านไป สิ่งนี้แสดงให้เห็นว่า Point2D ได้สืบทอดวิธีการคลาสแม่แล้วดูที่อินสแตนซ์
การแจ้งเตือน (จุดอินสแตนซ์ของจุด);
ความสำเร็จ! ตกลงวิเคราะห์การสืบทอดต้นแบบ:
ฉันจะไม่พูดถึงข้อดีของการสืบทอดต้นแบบ โครงสร้างนั้นง่ายเข้าใจง่ายและสามารถปรับปรุงได้ แต่ข้อบกพร่องของเขาก็มีความสำคัญเช่นกัน คุณจำตัวอย่างก่อนหน้าของฉันเกี่ยวกับสัตว์ผู้คนและเด็กผู้หญิงได้หรือไม่? เราใช้การสืบทอดต้นแบบเพื่อนำไปใช้ต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นสัตว์ ()
-
this.run = function () {การแจ้งเตือน ("ฉันสามารถเรียกใช้"));};
-
ฟังก์ชั่นคน (ชื่อ)
-
this.say = function () {alert ("ชื่อของฉันคือ"+this.name);}
-
people.prototype = สัตว์ใหม่ ();
ฟังก์ชั่นสาว (ชื่ออายุ)
-
this.age = อายุ;
this.introduce = function () {การแจ้งเตือน ("ชื่อของฉันคือ"+this.name+". ฉัน"+this.age);};
-
girl.prototype = คนใหม่ (???);
โปรดให้ความสนใจกับบรรทัดของรหัสในส่วนตัวหนาสีแดงของฉัน ผู้คนเป็นต้นแบบของหญิงสาว ดังนั้นเมื่อเราเริ่มต้นคนเราควรส่งผ่านพารามิเตอร์ชื่อ แต่ชื่อของผู้หญิงแต่ละคนแตกต่างกันดังนั้นจึงไม่มีการใช้การสืบทอดต้นแบบ: ในขั้นตอนการสืบทอดต้นแบบคุณไม่สามารถกำหนดพารามิเตอร์ที่จะใช้ในการเริ่มต้นวัตถุคลาสแม่ โอกาสที่ 2: มันง่ายมาก แต่ละคลาสสามารถมีต้นแบบเดียวเท่านั้นดังนั้นนั่นคือการสืบทอดต้นแบบไม่สามารถใช้สำหรับการสืบทอดหลายครั้ง นี่เป็นสิ่งที่ดีและเป็นสิ่งที่ไม่ดี เพราะ:
ในภาษาที่มุ่งเน้นวัตถุเช่น Java และ C#ไม่ได้รับการสนับสนุนหลายมรดกและเชื่อว่าการสืบทอดหลายครั้งจะเข้ากันไม่ได้กับวัตถุเชิงวัตถุ
ไม่สามารถใช้งานหลายอินเทอร์เฟซ!
โอเคนั่นคือทั้งหมดที่ฉันเขียนเกี่ยวกับวันนี้ เพื่อสรุปการสืบทอดต้นแบบจะช่วยแก้ปัญหาบางอย่างของการสร้างมรดกและแนะนำปัญหาใหม่บางอย่าง โดยรวมแล้วการสืบทอดต้นแบบเป็นวิธีการสืบทอดที่ใช้กันอย่างแพร่หลายมากที่สุดและยังเป็นวิธีการใช้มรดกในไวยากรณ์ JavaScript อย่างแท้จริง!