ดูเหมือนว่าใน 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
ที่ระบุ?