ดูเหมือนว่าใน JavaScript (ES6) super.__proto__ === this.__proto__ชั้นเรียน
คุณช่วยอธิบายได้ไหมว่าทำไมในกรณีนี้ พฤติกรรมดูเหมือนว่าสอดคล้องกันในเบราว์เซอร์ที่แตกต่างกันดังนั้นฉันสงสัยว่านี่จะถูกระบุไว้ในสเป็ค
พิจารณารหัสต่อไปนี้:
class Level1 {
myFunc() {
console.log('Level1');
}
}
class Level2 extends Level1 {
myFunc() {
console.log('Level2');
}
}
class Level3 extends Level2 {
myFunc() {
console.log('Level3 BEGIN ' + Math.random());
super.__proto__.myFunc();
console.log(super.__proto__ === this.__proto__);
console.log('Level3 END');
}
}
const foo = new Level3();
foo.myFunc();
ฉันคาดว่าsuper.__proto__.myFunc();จะเรียกฟังก์ชันmyFunc()ของคลาสLevel1และสิ่งsuper.__proto__ !== this.__proto__นั้น แต่super.__proto__.myFunc();ที่จริงเรียกร้องmyFunc()ของชั้นLevel3(มันเรียกตัวเอง) และจากนั้นในการภาวนาที่สองที่เรียกว่าของชั้นเรียนmyFunc() Level2นี่เป็นสิ่งที่เข้าใจได้อย่างสมบูรณ์หากsuper.__proto__ === this.__proto__รหัสนั้นแสดงให้เห็น
คุณช่วยอธิบายเหตุผลได้ทำไมsuper.__proto__ === this.__proto__ในตัวอย่างนี้ ถ้าเป็นไปได้โปรดให้การอ้างอิงถึงส่วนที่เกี่ยวข้องของข้อมูลจำเพาะ
__proto__การเป็นฟังก์ชั่นการเข้าถึงObject.prototypeและดำเนินการกับthisคุณค่าของพวกเขา แต่ฉันแค่นึกไม่ออกว่าsuperจริง ๆ แล้วมันถูกกำหนดให้ทำงานแบบนี้ ฉันคิดว่าsuperจะเทียบเท่าโดยประมาณthis.__proto__.__proto__ดังนั้นsuper.__proto__จะเท่ากับthis.__proto__.__proto__.__proto__ที่จะแสดงพฤติกรรมที่ฉันคาดหวัง คุณรู้หรือไม่ว่าในสเปคระบุพฤติกรรมที่แน่นอนของsuperที่ระบุ?