พื้นหลังด่วน:ใน JavaScript ฟังก์ชันตัวสร้างสำหรับวัตถุแต่ละชนิดมีprototype
คุณสมบัติ การprototype
อ้างถึงวัตถุที่แต่ละวัตถุที่สร้างขึ้นใช้เป็นขั้นตอนต่อไปในห่วงโซ่ต้นแบบ เมื่อคุณต้องการให้มีประเภทหนึ่งโดยธรรมชาติจากประเภทอื่นคุณสามารถตั้งค่าprototype
ประเภทเด็กเป็นอินสแตนซ์ใหม่ของประเภทแม่
ตัวอย่างเช่น:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
คำถามของฉันถามเกี่ยวกับรหัสที่ควรไปในSome prototype object goes here
จุดที่ระบุในรหัสด้านบน สัญชาตญาณแรกของฉันคือสร้างอินสแตนซ์ของพาเรนต์ (เช่นnew Parent()
) แต่ในความคิดเห็นต่อคำตอบนี่เป็นวิธีที่ปลอดภัยในการคัดลอกวัตถุต้นแบบหนึ่งไปยังวัตถุอื่นหรือไม่ ผู้ใช้หนึ่งคนเขียน:
ไม่อย่าใช้
new bar()
สำหรับวัตถุต้นแบบ!
(... ซึ่งเป็นความคิดเห็นที่ฉันได้เห็นในคำตอบและความคิดเห็น SO มากมาย แต่นี่เป็นเพียงตัวอย่างเดียวที่ฉันมีในขณะนี้)
ตัวเลือกอื่น ๆ คือการใช้เป็นObject.create(Parent.prototype)
Child.prototype
เท่าที่ฉันรู้สิ่งนี้ยังสร้างParent
อินสแตนซ์ใหม่แต่มันไม่เรียกใช้ตัวParent
สร้าง
มีใครบ้างที่สามารถอธิบายได้ว่าเหตุใดการเรียกใช้ฟังก์ชันคอนสตรัคเตอร์ควรหลีกเลี่ยงเมื่อสร้างวัตถุต้นแบบจากประเภทแม่ มีปัญหาทางเทคนิคที่สำคัญที่เกิดขึ้น (อาจมีหลายระดับของการสืบทอด) หรือรูปแบบดังกล่าวเป็นการใช้ในทางที่ผิดของตัวสร้างที่ขัดแย้งกับแนวปฏิบัติที่ดีที่สุดของต้นแบบ (เช่นการเรียกใช้ตัวสร้างเมื่อสร้างต้นแบบละเมิดการแยกข้อกังวล)
Object.create
การใช้งานจริง