หมายความว่า Javascript เป็นภาษาต้นแบบหรือไม่


255

หนึ่งในข้อดีที่สำคัญของ Javascript นั้นได้รับการกล่าวขานว่าเป็นภาษาที่ใช้ต้นแบบ

แต่มันหมายความว่าอะไรที่ Javascript ใช้ต้นแบบและทำไมมันถึงได้เปรียบ?


3
คำตอบนี้อธิบายทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับการรับมรดกต้นแบบ: stackoverflow.com/a/16872315/783743
Aadit M Shah

คำตอบ:


291

มรดก prototypalเป็นรูปแบบของเชิงวัตถุรหัสนำมาใช้ใหม่ Javascript เป็นหนึ่งในภาษาหลักเชิงวัตถุเท่านั้นที่จะใช้การสืบทอดต้นแบบ ภาษาเชิงวัตถุอื่นเกือบทั้งหมดเป็นแบบคลาสสิค

ในการสืบทอดคลาสสิกโปรแกรมเมอร์เขียนคลาสซึ่งกำหนดวัตถุ วัตถุหลายชิ้นสามารถสร้างอินสแตนซ์ได้จากคลาสเดียวกันดังนั้นคุณจึงมีรหัสในที่เดียวซึ่งอธิบายถึงวัตถุต่าง ๆ ในโปรแกรมของคุณ จากนั้นคลาสสามารถจัดเป็นลำดับชั้นได้ รหัสทั่วไปมากขึ้นจะถูกเก็บไว้ในระดับที่สูงกว่าซึ่งเป็นระดับที่ต่ำกว่าสืบทอด ซึ่งหมายความว่าวัตถุกำลังรหัสร่วมกับวัตถุอื่น ๆ ของคลาสเดียวกันเช่นเดียวกับกับผู้ปกครองชั้นเรียน

ในรูปแบบการสืบทอดต้นแบบวัตถุได้รับมรดกโดยตรงจากวัตถุอื่น ธุรกิจทั้งหมดเกี่ยวกับชั้นเรียนหมดไป หากคุณต้องการวัตถุคุณเพียงแค่เขียนวัตถุ แต่การนำโค้ดกลับมาใช้ยังคงเป็นสิ่งที่มีค่าดังนั้นวัตถุจึงได้รับอนุญาตให้เชื่อมโยงกันในลำดับชั้น ในจาวาสคริปต์ทุกวัตถุมีลิงค์ลับไปยังวัตถุที่สร้างขึ้นโดยสร้างเป็นห่วงโซ่ เมื่อวัตถุถูกถามหาคุณสมบัติที่ไม่มีวัตถุหลักของมันจะถูกถาม ... ต่อเนื่องขึ้นเรื่อย ๆ จนกระทั่งพบทรัพย์สินหรือจนกว่าจะถึงวัตถุราก

แต่ละฟังก์ชั่นในจาวาสคริปต์ (ซึ่งเป็นวัตถุเอง) จริง ๆ แล้วมีสมาชิกที่เรียกว่า "ต้นแบบ" ซึ่งมีหน้าที่รับผิดชอบในการให้ค่าเมื่อวัตถุถูกถามพวกเขา การมีสมาชิกนี้อนุญาตให้กลไกคอนสตรัคเตอร์ (โดยที่วัตถุถูกสร้างจากฟังก์ชั่น) ในการทำงาน การเพิ่มคุณสมบัติให้กับต้นแบบของฟังก์ชันวัตถุจะทำให้มันพร้อมใช้งานสำหรับวัตถุที่สร้างขึ้นรวมถึงวัตถุทั้งหมดที่สืบทอดจากมัน

ข้อดี

อาจไม่มีกฎที่ยากและรวดเร็วว่าทำไมการสืบทอดต้นแบบเป็นรูปแบบที่ได้เปรียบของการใช้รหัสซ้ำ การใช้รหัสซ้ำนั้นมีประโยชน์และการสืบทอดต้นแบบเป็นวิธีที่สมเหตุสมผลในการดำเนินการ คุณอาจจะเถียงว่ามรดก prototypal เป็นธรรมรูปแบบที่เรียบง่ายของรหัสที่นำมาใช้และรหัสที่สามารถนำกลับมาใช้อย่างมากในวิธีการโดยตรง แต่ภาษาคลาสสิกก็สามารถทำได้เช่นกัน

Sidenote: @Andrew Hedgesพูดได้ดีว่ามีภาษาต้นแบบหลายภาษา เป็นที่น่าสังเกตว่าคนเหล่านี้มีอยู่จริง แต่ก็ไม่ควรที่จะรู้ว่าไม่มีสิ่งใดที่ใกล้เคียงกับกระแสหลัก NewtonScript ดูเหมือนจะมีแรงฉุดอยู่พักหนึ่ง แต่ก็ตายด้วยแพลตฟอร์มของมัน นอกจากนี้ยังเป็นไปได้ที่จะขยายภาษาที่ทันสมัยในรูปแบบที่เพิ่มความสามารถต้นแบบ


9
เฮ้เคลลี่ ในขณะที่ JavaScript เป็นไกลโดยภาษา prototypal นิยมมากที่สุดยังมีอื่น ๆ อีกมากมาย: en.wikipedia.org/wiki/Prototype-based_programming#Languages
แอนดรูพุ่มไม้

2
เฮ้แอนดรู จุดดี. ฉันควรจะชัดเจนมากขึ้น ฉันจะจดบันทึกมัน
keparo

3
โปรดอ่านสิ่งนี้เช่นกันdeveloper.mozilla.org/en/JavaScript/Guide/…
pramodc84

1
+1 สำหรับคำตอบที่ดี หนึ่งความคิดเห็นเล็กน้อย: สำหรับฉันแล้วการสืบทอดแบบดั้งเดิมดูเหมือนจะ "ตรง" มากกว่าต้นแบบ ที่จริงแล้วฉันเห็นวัตถุต้นแบบเป็นเพียงการเชื่อมโยง (กับวัตถุอื่น) ในขณะที่ใน OOP ที่คอมไพล์ฉันคิดว่าคลาสฐานเป็น "สืบทอดโดยตรง" ดังนั้นวัตถุต้นแบบจะถูกล่ามโซ่ไว้ด้วยกันแทนที่จะได้รับมรดก ความคิดใด ๆ
ZERO Prisoner

3
@ PrisonerZERO: ฉันขอยืนยันว่ามรดกต้นแบบโดยตรงมากกว่าคลาสสิก แทนที่จะเป็นวัตถุ B ที่ชี้ไปยังคลาสที่สืบทอดจากคลาสที่วัตถุ A ชี้ไปที่มันจะชี้ไปที่วัตถุ A โดยตรงและบอกว่า "ฉันเหมือนกับวัตถุนั้นยกเว้น ... " เรื่องใหญ่เกี่ยวกับการถ่ายทอดทางพันธุกรรมต้นแบบและสิ่งที่ยากที่สุดสำหรับคนส่วนใหญ่ในการทำให้เป็นภายในก็คือมันไม่ได้แยกอินสแตนซ์ออกจากประเภท ทุกวัตถุมีทั้งประเภทและอินสแตนซ์ ความแตกต่างระหว่างคนทั้งสองเป็นสิ่งประดิษฐ์และไตร่ตรองโดยทั่วไปและมักเป็นอาการของการติดอยู่ในความคิดเชิงชนชั้น
cHao

54

ภาษาที่ใช้ต้นแบบไม่ได้สร้างความแตกต่างของคลาสกับวัตถุ: มันมีเพียงวัตถุ ภาษาที่ใช้ต้นแบบมีแนวคิดของวัตถุต้นแบบซึ่งเป็นวัตถุที่ใช้เป็นแม่แบบที่จะได้รับคุณสมบัติเริ่มต้นสำหรับวัตถุใหม่ วัตถุใด ๆ สามารถระบุคุณสมบัติของตัวเองได้ไม่ว่าคุณจะสร้างมันขึ้นมาหรือในขณะใช้งาน นอกจากนี้วัตถุใด ๆ ที่สามารถเชื่อมโยงได้เป็นต้นแบบสำหรับวัตถุอื่นทำให้วัตถุที่สองสามารถแบ่งปันคุณสมบัติของวัตถุแรก


6
คำอธิบายที่ดีมาก แต่ทำให้เข้าใจผิดเล็กน้อยเกี่ยวกับความคิดเห็นเกี่ยวกับ "เทมเพลตสำหรับคุณสมบัติเริ่มต้น" หากคุณเปลี่ยนต้นแบบหลังจากการทำให้วัตถุเป็นอินสแตนซ์วัตถุนั้นยังคงได้รับฟังก์ชั่นเหล่านั้น
nickf

32

การเขียนโปรแกรมแบบอิงต้นแบบเป็นรูปแบบของการเขียนโปรแกรมเชิงวัตถุที่ไม่มีคลาสและการใช้งานพฤติกรรมซ้ำ (หรือการสืบทอดในภาษาที่อิงกับคลาส) ดำเนินการโดยการโคลนวัตถุที่มีอยู่ซึ่งทำหน้าที่เป็นต้นแบบ


คุณยังรู้สึกอย่างนี้หรือไม่? เพราะถ้าอย่างนั้นนี่คือคำอธิบายแรกที่จริง ๆ แล้ว "คลิก" กับฉันอย่างแน่นหนา
Chazt3n

11

ข้อดี / ข้อเสียคือเราสามารถสร้างวัตถุชนิดใหม่ ณ รันไทม์โดยไม่จำเป็นต้องกำหนดคลาส (รหัสคงที่) เช่นเดียวกับฟีเจอร์ส่วนใหญ่นักพัฒนาไม่ควรเกินกว่าที่จะเปลี่ยนเป็นข้อดี / ข้อเสีย

ข้างต้นเป็นไปได้เพราะวัตถุนั้นมีฟังก์ชั่นเป็นหลักในจาวาสคริปต์ (ปิดด้วย)


วัตถุแบบไดนามิกเป็นประโยชน์ของจาวาสคริปต์ แต่ไม่เกี่ยวข้องกับจาวาสคริปต์เป็นภาษาต้นแบบหรือภาษาที่ใช้งานได้ ในหลายภาษาคลาสสิคคุณสามารถสร้างวัตถุแบบไดนามิกที่รันไทม์ การปิดไม่เกี่ยวข้องกันบ้างเช่นกัน
keparo

2
คลาสไม่จำเป็นต้องเป็นรหัสคงที่ - ดู Python ซึ่งคลาสเป็นวัตถุเองและสร้างจาก metaclasses ซึ่งเป็นวัตถุด้วย
Tomasz Zieliński

6

แทนที่จะประกาศโครงสร้างคลาสคุณสามารถสร้างวัตถุประเภทเดียวกันและเพิ่มคำจำกัดความของพวกเขาได้ตลอดเวลาที่คุณต้องการใช้ต้นแบบของวัตถุ มีความยืดหยุ่นมากกว่าวิธีปกติในการทำสิ่งต่าง ๆ


6

หากคุณเพิ่งใช้อ็อบเจกต์ที่รันไทม์แทนคลาสที่คอมไพล์เพื่อสร้างออบเจกต์ใหม่สิ่งนี้จะเปิดโอกาสให้ขยายวัตถุโดยไม่ทราบรายละเอียดใด ๆ แน่นอนมันอาจกลายเป็นข้อเสียอย่างรวดเร็วขึ้นอยู่กับการใช้งาน ฉันไม่มีข้อสมมติฐานเกี่ยวกับภาษาที่นี่ดังนั้นจึงสามารถใช้ได้กับภาษาอื่นที่ไม่ใช่จาวาสคริปต์ซึ่งไม่ได้เป็นแบบไดนามิก

myobject.prototype=unkownobject;
myobject.newproperty=1;

คุณอาจได้วัตถุจากที่ใดก็ได้ รหัสของคุณเองจากเครือข่ายจากฐานข้อมูลจากลิงก์ภายนอกและอื่น ๆ

โปรดทราบว่าภาษาไม่จำเป็นต้องใช้การสืบทอดต้นแบบเช่น javascript ในจาวาสคริปต์วัตถุต้นแบบจะถูกแชร์เพียงอย่างเดียวดังนั้นคุณสมบัติของมันจึงอยู่ในหมู่ผู้รับ ทางเลือกคือการคัดลอกคุณสมบัติทั้งหมดของต้นแบบไปยังวัตถุใหม่ แต่ละวิธีมีจุดแข็งในสถานการณ์ต่าง ๆ ฉันชอบอันดับที่สองมากกว่า แต่ไม่ใช่จาวาสคริปต์ที่ทำ


6

หลังจากอ่านคำตอบทั้งหมดนี่คือข้อสรุป

1) การสืบทอดซึ่งวัตถุได้รับการถ่ายทอดโดยตรงจากวัตถุอื่น

2) นั่นไม่ได้ใช้คลาส

3) หรือที่เรียกว่าการเขียนโปรแกรมตามอินสแตนซ์หรือการเขียนโปรแกรมเชิงต้นแบบที่ไม่มีคลาส

4) การใช้พฤติกรรมซ้ำโดยการโคลนวัตถุที่มีอยู่ซึ่งทำหน้าที่เป็นต้นแบบ

5) วัตถุที่ใช้เป็นแม่แบบจากวัตถุใหม่จะได้รับคุณสมบัติเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.