Tampaknya dalam Kelas JavaScript (ES6) super.__proto__ === this.__proto__.
Bisakah Anda jelaskan mengapa ini masalahnya? Perilaku ini tampaknya konsisten di berbagai browser, jadi saya curiga ini ditentukan di suatu tempat dalam spesifikasi.
Pertimbangkan kode berikut:
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();
Saya akan berharap itu super.__proto__.myFunc();akan memanggil fungsi myFunc()kelas Level1dan itu super.__proto__ !== this.__proto__. Sebaliknya super.__proto__.myFunc();sebenarnya panggilan myFunc()kelas Level3(panggilan itu sendiri) dan kemudian pada doa kedua panggilan myFunc()kelas Level2. Ini sangat bisa dipahami jika super.__proto__ === this.__proto__kode menunjukkan.
Bisakah Anda menjelaskan alasannya mengapa super.__proto__ === this.__proto__dalam contoh ini? Jika memungkinkan, berikan juga referensi ke bagian spesifikasi yang relevan.
__proto__benar-benar menjadi fungsi pengaksesObject.prototypedan beroperasi padathisnilai mereka . Tapi saya tidak bisa membayangkansuperitu sebenarnya ditentukan untuk bekerja dengan cara ini. Saya pikirsuperkira-kira setara denganthis.__proto__.__proto__, jadisuper.__proto__akan sama denganthis.__proto__.__proto__.__proto__yang akan menunjukkan perilaku yang saya harapkan. Apakah Anda tahu, di mana dalam spesifikasi perilaku yang tepatsuperditentukan?