ต้นแบบเป็นการเพิ่มประสิทธิภาพ
ตัวอย่างที่ดีในการใช้ไลบรารี jQuery ทุกครั้งที่คุณได้รับวัตถุ jQuery โดยใช้$('.someClass')
วัตถุนั้นจะมี "วิธีการ" มากมาย ไลบรารีสามารถบรรลุสิ่งนั้นได้โดยส่งคืนวัตถุ:
return {
show: function() { ... },
hide: function() { ... },
css: function() { ... },
animate: function() { ... },
};
แต่นั่นหมายความว่าทุกออบเจ็กต์ jQuery ในหน่วยความจำจะมีสล็อตที่มีชื่อหลายสิบช่องที่มีเมธอดเดียวกันซ้ำแล้วซ้ำเล่า
แต่วิธีการเหล่านั้นถูกกำหนดบนต้นแบบและวัตถุ jQuery ทั้งหมด "สืบทอด" ต้นแบบนั้นเพื่อให้ได้รับวิธีการเหล่านั้นทั้งหมดโดยมีต้นทุนรันไทม์น้อยมาก
ส่วนหนึ่งที่สำคัญอย่างยิ่งในการทำให้ jQuery ถูกต้องก็คือสิ่งนี้ถูกซ่อนจากโปรแกรมเมอร์ ถือว่าเป็นการเพิ่มประสิทธิภาพเท่านั้นไม่ใช่สิ่งที่คุณต้องกังวลเมื่อใช้ไลบรารี
ปัญหาของ JavaScript คือฟังก์ชันตัวสร้างที่เปลือยเปล่าต้องการให้ผู้โทรอย่าลืมใส่คำนำหน้าด้วยnew
มิฉะนั้นโดยทั่วไปจะไม่ทำงาน ไม่มีเหตุผลที่ดีสำหรับเรื่องนี้ jQuery ทำให้มันถูกต้องโดยการซ่อนเรื่องไร้สาระไว้เบื้องหลังฟังก์ชั่นธรรมดา$
ดังนั้นคุณไม่ต้องสนใจว่าจะใช้งานวัตถุอย่างไร
เพื่อให้คุณสะดวกสามารถสร้างวัตถุที่มีต้นแบบที่กำหนด ECMAScript 5 Object.create
รวมถึงฟังก์ชั่นมาตรฐาน เวอร์ชันที่เรียบง่ายขึ้นมากจะมีลักษณะดังนี้:
Object.create = function(prototype) {
var Type = function () {};
Type.prototype = prototype;
return new Type();
};
new
มันใช้เวลาเพียงดูแลความเจ็บปวดจากการเขียนฟังก์ชั่นคอนสตรัคแล้วเรียกมันว่าด้วย
คุณจะหลีกเลี่ยงต้นแบบเมื่อใด
การเปรียบเทียบที่มีประโยชน์คือภาษา OO ยอดนิยมเช่น Java และ C # สิ่งเหล่านี้สนับสนุนการถ่ายทอดทางพันธุกรรมสองประเภท:
- การสืบทอดอินเทอร์เฟซโดยที่คุณ
implement
เป็นinterface
เช่นนั้นคลาสจะจัดเตรียมการนำไปใช้งานเฉพาะสำหรับสมาชิกทุกคนของอินเทอร์เฟซ
- การดำเนินการรับมรดกที่คุณที่ให้การใช้งานเริ่มต้นของวิธีการบางอย่าง
extend
class
ใน JavaScript การสืบทอดต้นแบบคือการสืบทอดการนำไปใช้งานประเภทหนึ่ง ดังนั้นในสถานการณ์เหล่านั้นที่ (ใน C # หรือ Java) คุณจะได้รับมาจากคลาสพื้นฐานเพื่อให้ได้พฤติกรรมเริ่มต้นซึ่งคุณจะทำการปรับเปลี่ยนเล็กน้อยผ่านการแทนที่จากนั้นใน JavaScript การสืบทอดต้นแบบก็สมเหตุสมผล
อย่างไรก็ตามหากคุณอยู่ในสถานการณ์ที่คุณจะต้องใช้อินเทอร์เฟซใน C # หรือ Java คุณก็ไม่จำเป็นต้องมีคุณสมบัติภาษาใด ๆ ใน JavaScript ไม่จำเป็นต้องประกาศสิ่งที่แสดงถึงอินเทอร์เฟซอย่างชัดเจนและไม่จำเป็นต้องทำเครื่องหมายออบเจ็กต์ว่า "ใช้งาน" อินเทอร์เฟซนั้น:
var duck = {
quack: function() { ... }
};
duck.quack();
กล่าวอีกนัยหนึ่งถ้า "ประเภท" ของวัตถุแต่ละชนิดมีคำจำกัดความของ "วิธีการ" ของตัวเองแสดงว่าไม่มีคุณค่าในการสืบทอดจากต้นแบบ หลังจากนั้นขึ้นอยู่กับจำนวนอินสแตนซ์ที่คุณจัดสรรสำหรับแต่ละประเภท แต่ในการออกแบบโมดูลาร์จำนวนมากมีเพียงอินสแตนซ์เดียวของประเภทที่กำหนด
และในความเป็นจริงจะได้รับการแนะนำโดยคนจำนวนมากที่ได้รับมรดกการดำเนินการเป็นความชั่วร้าย นั่นคือหากมีการดำเนินการทั่วไปบางอย่างสำหรับประเภทหนึ่งอาจจะชัดเจนกว่าถ้าพวกเขาไม่ได้ใส่ลงในคลาสพื้นฐาน / ซูเปอร์คลาส แต่จะแสดงเป็นฟังก์ชันธรรมดาในบางโมดูลแทนซึ่งคุณส่งผ่านวัตถุ คุณต้องการให้พวกเขาดำเนินการ