JavaScript เป็นภาษาที่ใช้กันอย่างแพร่หลายเพียงอย่างเดียวสำหรับการสืบทอดของต้นแบบดังนั้นจึงต้องใช้เวลาในการทำความเข้าใจความแตกต่างระหว่างวิธีการสืบทอดสองวิธี
ความแตกต่างที่สำคัญครั้งแรกคือ JavaScript ใช้โซ่ต้นแบบเพื่อสืบทอด:
function foo () {this.value = 42;} foo.prototype = {method: function () {}}; function bar () {}ตั้งต้นแบบของ Bar เป็นอินสแตนซ์ของวัตถุของ Foo:
bar.prototype = new foo (); bar.prototype.foo = 'Hello World';
ตรวจสอบให้แน่ใจว่าตัวสร้างของบาร์เป็นตัวของตัวเองและสร้างอินสแตนซ์วัตถุบาร์ใหม่:
bar.prototype.constructor = bar; var test = new bar ();
ลองมาดูองค์ประกอบของห่วงโซ่ต้นแบบทั้งหมด:
ทดสอบ [อินสแตนซ์ของบาร์] bar.prototype [อินสแตนซ์ของ foo] {foo: 'Hello World'} foo.prototype {วิธี: ... } object.prototype {toString: ... / * ฯลฯ * /}ในตัวอย่างข้างต้นการทดสอบวัตถุจะสืบทอดทั้ง bar.prototype และ foo.prototype ดังนั้นจึงสามารถเข้าถึงวิธีการทำงานที่กำหนดไว้ใน FOO แน่นอนมันยังสามารถเข้าถึงมูลค่าคุณสมบัติ มันควรจะกล่าวถึงว่าเมื่อไม่ได้สร้างแถบใหม่ () อินสแตนซ์ FOO ใหม่จะถูกนำกลับมาใช้ใหม่ แต่อินสแตนซ์ FOO ที่มาพร้อมกับวัตถุต้นแบบ ในทำนองเดียวกันอินสแตนซ์ของแถบทั้งหมดจะใช้แอตทริบิวต์ค่าเดียวกัน มายกตัวอย่างกันเถอะ:
test1 = แถบใหม่ (); test2 = แถบใหม่ (); bar.prototype.value = 41; test1.value // 41 test2.value // 41
กลไกการค้นหาห่วงโซ่ต้นแบบ
เมื่อเข้าถึงคุณสมบัติของวัตถุ JavaScript จะสำรวจห่วงโซ่ต้นแบบทั้งหมดจากวัตถุเองจนกว่าจะพบคุณสมบัติที่สอดคล้องกัน หากคุณไปถึงด้านบนของห่วงโซ่ต้นแบบซึ่งเป็น object.prototype ในตัวอย่างข้างต้นและยังไม่พบคุณลักษณะที่จะพบ JavaScript จะส่งคืนค่าที่ไม่ได้กำหนด
คุณสมบัติของวัตถุต้นแบบ
แม้ว่าคุณสมบัติของวัตถุต้นแบบจะถูกใช้โดย JavaScript เพื่อสร้างห่วงโซ่ต้นแบบ แต่เรายังสามารถกำหนดค่าให้กับมันได้ แต่การคัดลอกค่าดั้งเดิมไปยังต้นแบบนั้นไม่ถูกต้องเช่น:
function foo () {} foo.prototype = 1; // ไม่มีผลนี่คือสิ่งที่ทำให้ไขว้เขวจากบทความนี้และแนะนำค่าดั้งเดิมคืออะไร:
ใน JavaScript ตัวแปรสามารถจัดเก็บค่าสองประเภท ได้แก่ ค่าดั้งเดิมและค่าอ้างอิง
1. ค่าดั้งเดิม:
ค่าดั้งเดิมได้รับการแก้ไขและค่าที่ง่ายซึ่งเป็นส่วนข้อมูลอย่างง่ายที่เก็บไว้ในสแต็กนั่นคือค่าของพวกเขาจะถูกเก็บไว้โดยตรงที่ตำแหน่งที่มีการเข้าถึงตัวแปร
มีห้าประเภทของประเภทดั้งเดิม: undefined, null, boolean, จำนวน, สตริง
2. ค่าอ้างอิง:
ค่าอ้างอิงเป็นวัตถุที่ค่อนข้างใหญ่วัตถุที่เก็บไว้ในกองฮีปนั่นคือค่าที่เก็บไว้ที่ตัวแปรคือตัวชี้ตัวชี้ที่ชี้ไปที่หน่วยความจำที่เก็บวัตถุไว้ ประเภทการอ้างอิงทั้งหมดจะรวมจากวัตถุ
ปัญหาประสิทธิภาพห่วงโซ่ต้นแบบ
หากคุณลักษณะที่จะพบจะอยู่ที่ด้านบนของห่วงโซ่ต้นแบบกระบวนการค้นหาจะมีผลกระทบเชิงลบต่อประสิทธิภาพอย่างไม่ต้องสงสัย นี่จะเป็นข้อพิจารณาที่สำคัญเมื่ออยู่ในสถานการณ์ที่จำเป็นต้องมีความต้องการด้านประสิทธิภาพ นอกจากนี้การพยายามค้นหาคุณสมบัติที่ไม่มีอยู่จะผ่านห่วงโซ่ต้นแบบทั้งหมด
ในทำนองเดียวกันเมื่อข้ามคุณสมบัติของวัตถุคุณสมบัติทั้งหมดในห่วงโซ่ต้นแบบจะถูกเข้าถึง
สรุป
การทำความเข้าใจการสืบทอดต้นแบบเป็นสิ่งที่จำเป็นสำหรับการเขียนรหัสจาวาสคริปต์ที่ซับซ้อนมากขึ้นและคุณต้องใส่ใจกับความสูงของห่วงโซ่ต้นแบบในรหัส เมื่อเผชิญหน้ากับคอขวดประสิทธิภาพคุณต้องเรียนรู้ที่จะแยกห่วงโซ่ต้นแบบ นอกจากนี้เพื่อแยกความแตกต่างต้นแบบวัตถุต้นแบบจากต้นแบบ __proto__ เราจะหารือเกี่ยวกับต้นแบบวัตถุต้นแบบต้นแบบที่นี่และเราจะไม่อธิบายปัญหาเกี่ยวกับต้นแบบ __proto__