ยืมมรดกตัวสร้าง
ในการแก้ปัญหาการรวมค่าประเภทอ้างอิงในต้นแบบนักพัฒนาเริ่มใช้เทคนิคที่เรียกว่ายืมตัวสร้างการขโมย (บางครั้งเรียกวัตถุปลอมแปลงหรือการสืบทอดแบบคลาสสิก) แนวคิดพื้นฐานของเทคนิคนี้ค่อนข้างง่ายคือเรียกตัวสร้าง Supertype ภายในตัวสร้างชนิดย่อย
โหมดพื้นฐาน
ฟังก์ชั่น supertype () {this.colors = ["สีแดง", "สีน้ำเงิน", "เขียว"];} ฟังก์ชั่น subtype () {// ที่สืบทอดมา supertype supertype.call (นี่);} var instance1 = subtype (new subtype (); // "สีแดง, สีน้ำเงิน, เขียว, ดำ" อินสแตนซ์ VAR = ใหม่ชนิดย่อย (); แจ้งเตือน (อินสแตนซ์ 2.Colors); // "สีแดง, น้ำเงิน, เขียว"ไอเดียพื้นฐาน
แนวคิดพื้นฐานของการยืมตัวสร้างคือการใช้การโทรหรือนำไปใช้เพื่อคัดลอก (ยืม) คุณสมบัติและวิธีการที่ระบุในคลาสพาเรนต์ลงในอินสแตนซ์ที่สร้างโดยคลาสย่อย เนื่องจากวัตถุนี้ถูกผูกไว้ที่รันไทม์ตามสภาพแวดล้อมการดำเนินการของฟังก์ชัน กล่าวคือทั่วโลกสิ่งนี้เท่ากับหน้าต่างและเมื่อฟังก์ชั่นถูกเรียกว่าเป็นวิธีการของวัตถุสิ่งนี้เท่ากับวัตถุนั้น วิธีการโทรและการใช้สามารถใช้เรียกวิธีการแทนวัตถุอื่น วิธีการโทรและการใช้สามารถเปลี่ยนบริบทวัตถุของฟังก์ชันจากบริบทเริ่มต้นเป็นวัตถุใหม่ที่ระบุโดย Thisobj
ดังนั้นตัวสร้างการยืมนี้คือเมื่อมีการเรียกวัตถุใหม่ (โปรดทราบว่าตัวดำเนินการใหม่นั้นแตกต่างจากการเรียกโดยตรงเมื่อเรียกใช้ฟังก์ชันจุดนี้ชี้ไปที่หน้าต่างเมื่อสร้างใหม่จุดนี้ชี้ไปที่อินสแตนซ์ที่สร้างขึ้น) วัตถุอินสแตนซ์ใหม่จะถูกสร้างขึ้น การโทรในการเรียก subtype sublype ซึ่งหมายความว่าการชี้นี้จะเปลี่ยนเป็นชี้ไปที่อินสแตนซ์ใหม่ดังนั้นคุณลักษณะและวิธีการที่เกี่ยวข้องนี้ใน SuperType จะถูกกำหนดให้กับอินสแตนซ์ใหม่แทนที่จะกำหนดให้กับ suptype อินสแตนซ์ทั้งหมดมีคุณสมบัติและวิธีการเหล่านี้ของสิ่งนี้ที่กำหนดโดยคลาสหลัก
ข้อดี
เมื่อเปรียบเทียบกับห่วงโซ่ต้นแบบตัวสร้างการยืมมีข้อได้เปรียบที่ดีนั่นคือพวกเขาสามารถส่งผ่านพารามิเตอร์ไปยังตัวสร้าง supertype ในตัวสร้างชนิดย่อย เนื่องจากแอตทริบิวต์ถูกผูกไว้กับสิ่งนี้จึงถูกกำหนดให้กับอินสแตนซ์ที่เกี่ยวข้องเมื่อเรียกและค่าของแต่ละอินสแตนซ์จะไม่ส่งผลต่อกันและกัน
ตัวอย่างเช่น:
ฟังก์ชั่น superType (ชื่อ) {this.name = name;} ฟังก์ชั่น subtype () {// สืบทอด superType และยังส่งพารามิเตอร์ superType.call (นี่ "nicholas"); // แอตทริบิวต์อินสแตนซ์ this.age = 29; //" nicholas";alert(instance.age); // 29ข้อเสีย
หากคุณเพียงแค่ยืมตัวสร้างปัญหาเกี่ยวกับรูปแบบตัวสร้างจะไม่ถูกหลีกเลี่ยง - วิธีการทั้งหมดถูกกำหนดไว้ในตัวสร้างดังนั้นจึงไม่มีวิธีที่จะพูดคุยเกี่ยวกับการใช้ฟังก์ชั่นซ้ำ ยิ่งไปกว่านั้นวิธีการที่กำหนดไว้ในต้นแบบ supertype ยังมองไม่เห็นชนิดย่อยและด้วยเหตุนี้ทุกประเภทสามารถใช้รูปแบบตัวสร้างเท่านั้น เมื่อพิจารณาถึงปัญหาเหล่านี้เทคนิคการยืมตัวสร้างก็ไม่ค่อยใช้เพียงอย่างเดียว
มรดกแบบผสมผสาน
การสืบทอดการรวมกันบางครั้งเรียกว่ามรดกแบบหลอกคลาสสิก มันเป็นแบบจำลองการสืบทอดที่รวมห่วงโซ่ต้นแบบและเทคโนโลยีตัวสร้างที่ยืมมาเป็นชิ้นเดียวเพื่อเล่นจุดแข็งของทั้งคู่
ไอเดียพื้นฐาน
แนวคิดคือการใช้ห่วงโซ่ต้นแบบเพื่อใช้การสืบทอดคุณสมบัติและวิธีการต้นแบบและเพื่อใช้การสืบทอดคุณสมบัติอินสแตนซ์โดยการยืมตัวสร้าง ด้วยวิธีนี้ฟังก์ชั่นมัลติเพล็กซ์ทำได้โดยการกำหนดวิธีการบนต้นแบบและยังสามารถตรวจสอบให้แน่ใจว่าแต่ละอินสแตนซ์มีคุณสมบัติของตัวเอง
โมเดลพื้นฐาน
ฟังก์ชั่น supertype (ชื่อ) {this.name = name; this.colors = ["red", "blue", "green"];} supertype.prototype.sayname = function () {alert (this.name);}; ฟังก์ชั่นย่อย (ชื่อ, อายุ) {// แอตทริบิวต์การสืบทอด supertype.call this.age = age;} // วิธีการสืบทอด subtype.prototype = new supertype (); subtype.prototype.constructor = subtype; type.prototype.sayage = function () {alert (this.age); 29); instance1.colors.push ("ดำ"); แจ้งเตือน (อินสแตนซ์ 1.Colors); // "สีแดง, น้ำเงิน, เขียว, ดำ" อินสแตนซ์ 1.SayName (); // "นิโคลัส"; อินสแตนซ์ 1.Sayage (); // 29VAR Instance2 = ชนิดย่อยใหม่ ("Greg", 27); Alert (Instance2.Colors); // "สีแดง, น้ำเงิน, สีเขียว" อินสแตนซ์ 2.sayname (); // "greg"; instance2.sayage (); // 27ข้อดี
การสืบทอดการรวมกันช่วยหลีกเลี่ยงข้อบกพร่องของห่วงโซ่ต้นแบบและตัวสร้างที่ยืมมารวมข้อดีของพวกเขาและกลายเป็นรูปแบบการสืบทอดที่ใช้กันมากที่สุดในจาวาสคริปต์
ข้อเสีย
ปัญหาที่ใหญ่ที่สุดของการสืบทอดแบบรวมกันคือไม่ว่าในกรณีใดตัวสร้าง Supertype จะถูกเรียกสองครั้ง: หนึ่งครั้งเมื่อสร้างต้นแบบย่อยชนิดและเวลาอื่น ๆ ภายในตัวสร้างชนิดย่อย ในขณะที่ชนิดย่อยจะมีคุณสมบัติอินสแตนซ์ทั้งหมดของวัตถุ supertype เราต้องแทนที่คุณสมบัติเหล่านี้เมื่อเรียกตัวสร้างชนิดย่อย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น