Parece que en JavaScript (ES6) Clases super.__proto__ === this.__proto__.
¿Puedes explicar por qué este es el caso? El comportamiento parece consistente en diferentes navegadores, por lo que sospecho que esto se especifica en algún lugar de la especificación.
Considere el siguiente código:
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();
Hubiera esperado que eso super.__proto__.myFunc();llamara la función myFunc()de clase Level1y eso super.__proto__ !== this.__proto__. En cambio, en super.__proto__.myFunc();realidad llama myFunc()a la clase Level3(se llama a sí mismo) y luego, en la segunda invocación, llama myFunc()a la clase Level2. Esto es perfectamente comprensible si super.__proto__ === this.__proto__el código lo demuestra.
¿Puedes explicar la razón por qué super.__proto__ === this.__proto__en este ejemplo? Si es posible, proporcione también referencias a la sección relevante de la especificación.
__proto__estar realmente en funciones de accesoObject.prototypey operar en suthisvalor. Pero no podía imaginar que ensuperrealidad se especificara que funcionara de esta manera. Pensé ensuperser más o menos equivalente athis.__proto__.__proto__, porsuper.__proto__lo que habría sido equivalente athis.__proto__.__proto__.__proto__lo que habría exhibido el comportamiento que esperaba. ¿Sabes en qué parte de la especificación se especifica el comportamiento exacto desuper?