แก้ไขกุมภาพันธ์ 2555: คำตอบด้านล่างไม่ถูกต้องอีกต่อไป กำลังเพิ่ม __proto__ ใน ECMAScript 6 เป็น "ทางเลือกเชิงบรรทัดฐาน" ซึ่งหมายความว่าไม่จำเป็นต้องนำไปใช้ แต่ถ้าเป็นเช่นนั้นจะต้องเป็นไปตามชุดของกฎที่กำหนด ขณะนี้ยังไม่ได้รับการแก้ไข แต่อย่างน้อยก็จะเป็นส่วนหนึ่งของข้อกำหนดของ JavaScript อย่างเป็นทางการ
คำถามนี้ซับซ้อนกว่าที่คิดบนพื้นผิวมากและนอกเหนือจากระดับการจ่ายเงินของคนส่วนใหญ่ในเรื่องความรู้เกี่ยวกับ Javascript ภายใน
prototype
คุณสมบัติของวัตถุจะใช้เมื่อมีการสร้างวัตถุลูกใหม่ของวัตถุที่ การเปลี่ยนมันไม่ได้สะท้อนให้เห็นในตัววัตถุ แต่จะสะท้อนให้เห็นเมื่อวัตถุนั้นถูกใช้เป็นตัวสร้างสำหรับวัตถุอื่นและไม่มีประโยชน์ในการเปลี่ยนต้นแบบของวัตถุที่มีอยู่
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
วัตถุมีคุณสมบัติ [[ต้นแบบ]] ภายในซึ่งชี้ไปยังต้นแบบปัจจุบัน วิธีการทำงานคือเมื่อใดก็ตามที่คุณสมบัติบนอ็อบเจ็กต์ถูกเรียกมันจะเริ่มต้นที่อ็อบเจ็กต์จากนั้นขึ้นไปตามโซ่ [[ต้นแบบ]] จนกว่าจะพบว่าตรงกันหรือล้มเหลวหลังจากรูทอ็อบเจ็กต์ต้นแบบ นี่คือวิธีที่ Javascript อนุญาตให้สร้างรันไทม์และแก้ไขอ็อบเจ็กต์ มีแผนที่จะค้นหาสิ่งที่ต้องการ
__proto__
คุณสมบัติที่มีอยู่ในการใช้งานบางคน (มากตอนนี้): การดำเนินการใด ๆ ของ Mozilla ทุกคน WebKit ฉันรู้ว่าของบางคนอื่น ๆ คุณสมบัตินี้ชี้ไปที่คุณสมบัติ [[ต้นแบบ]] ภายในและอนุญาตให้แก้ไขหลังการสร้างบนวัตถุ คุณสมบัติและฟังก์ชั่นใด ๆ จะเปลี่ยนให้ตรงกับต้นแบบทันทีเนื่องจากการค้นหาที่ถูกล่ามโซ่นี้
คุณลักษณะนี้ในขณะที่ได้รับการปรับให้เป็นมาตรฐานในขณะนี้ยังคงไม่ใช่ส่วนที่จำเป็นของ JavaScript และในภาษาที่รองรับคุณลักษณะนี้มีโอกาสสูงที่จะทำให้โค้ดของคุณตกอยู่ในหมวดหมู่ "ไม่ได้เพิ่มประสิทธิภาพ" เอ็นจิ้น JS ต้องพยายามอย่างดีที่สุดในการจัดประเภทโค้ดโดยเฉพาะโค้ด "ร้อน" ซึ่งมีการเข้าถึงบ่อยมากและหากคุณกำลังทำอะไรแปลก ๆ เช่นการปรับเปลี่ยน__proto__
พวกเขาจะไม่เพิ่มประสิทธิภาพโค้ดของคุณเลย
โพสต์นี้https://bugzilla.mozilla.org/show_bug.cgi?id=607863โดยเฉพาะกล่าวถึงการนำไปใช้ในปัจจุบัน__proto__
และความแตกต่างระหว่างกัน การใช้งานทุกครั้งไม่เหมือนกันเพราะเป็นปัญหาที่ยากและไม่ได้รับการแก้ไข ทุกอย่างใน Javascript ไม่แน่นอนยกเว้น.) ไวยากรณ์ข.) วัตถุโฮสต์ (DOM ที่มีอยู่นอก Javascript ทางเทคนิค) __proto__
และค.) ส่วนที่เหลืออยู่ในมือของคุณและนักพัฒนารายอื่น ๆ ทั้งหมดดังนั้นคุณจะเห็นได้ว่าทำไมจึง__proto__
ยื่นออกมาเหมือนนิ้วโป้งที่เจ็บ
มีสิ่งหนึ่งที่__proto__
อนุญาตให้ทำสิ่งนั้นไม่ได้นั่นคือการกำหนดต้นแบบวัตถุที่รันไทม์แยกจากตัวสร้าง นี่เป็นกรณีการใช้งานที่สำคัญและเป็นหนึ่งในสาเหตุหลักที่__proto__
ยังไม่ตาย มีความสำคัญมากพอที่จะเป็นประเด็นสนทนาอย่างจริงจังในการกำหนด Harmony หรือเร็ว ๆ นี้เรียกว่า ECMAScript 6 ความสามารถในการระบุต้นแบบของวัตถุในระหว่างการสร้างจะเป็นส่วนหนึ่งของ Javascript เวอร์ชันถัดไปและจะเป็น ระฆังที่ระบุ__proto__
วันเป็นตัวเลขอย่างเป็นทางการ
ในระยะสั้นคุณสามารถใช้ได้__proto__
หากคุณกำหนดเป้าหมายเบราว์เซอร์ที่รองรับ (ไม่ใช่ IE และไม่เคยมี IE) มีแนวโน้มว่ามันจะใช้งานได้ใน webkit และ moz ในอีก 10 ปีข้างหน้าเนื่องจาก ES6 จะไม่ได้รับการสรุปจนถึงปี 2013
Brendan Eich - re: แนวทางของ Object method ใหม่ใน ES5 :
ขออภัย ... แต่สามารถตั้งค่าได้__proto__
นอกเหนือจากกรณีการใช้งานวัตถุเริ่มต้น (เช่นบนวัตถุใหม่ที่ยังไม่สามารถเข้าถึงได้ซึ่งคล้ายกับ Object.create ของ ES5) เป็นความคิดที่แย่มาก ฉันเขียนสิ่งนี้โดยออกแบบและใช้งานได้__proto__
เมื่อ 12 ปีที่แล้ว
... การขาดการแบ่งชั้นเป็นปัญหา (พิจารณาข้อมูล JSON ด้วยคีย์"__proto__"
) และที่แย่กว่านั้นความสามารถในการเปลี่ยนรูปหมายถึงการนำไปใช้งานต้องตรวจสอบห่วงโซ่ต้นแบบแบบวัฏจักรเพื่อหลีกเลี่ยงการหลุดลอก [ต้องมีการตรวจสอบอย่างต่อเนื่องสำหรับการเรียกซ้ำแบบไม่มีที่สิ้นสุด]
ในที่สุดการกลายพันธุ์__proto__
บนวัตถุที่มีอยู่อาจทำลายวิธีการที่ไม่ใช่ทั่วไปในวัตถุต้นแบบใหม่ซึ่งอาจไม่สามารถทำงานบนวัตถุตัวรับ (โดยตรง) ที่__proto__
กำลังตั้งค่าได้ นี่เป็นเพียงการปฏิบัติที่ไม่ดีรูปแบบหนึ่งของความสับสนโดยเจตนาโดยทั่วไป