Parece que nas classes JavaScript (ES6) super.__proto__ === this.__proto__.
Você pode explicar por que esse é o caso? O comportamento parece consistente em diferentes navegadores, então suspeito que isso esteja especificado em algum lugar da especificação.
Considere o seguinte 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();
Eu esperava que super.__proto__.myFunc();isso chamasse a função myFunc()de classe Level1e isso super.__proto__ !== this.__proto__. Em vez disso, super.__proto__.myFunc();na verdade, chama myFunc()de classe Level3(ela se chama) e, na segunda chamada, chama myFunc()de classe Level2. Isso é perfeitamente compreensível se super.__proto__ === this.__proto__o código demonstrar.
Você pode explicar o porquê super.__proto__ === this.__proto__neste exemplo? Se possível, forneça também referências à seção relevante da especificação.
__proto__realmente ser funções acessorasObject.prototypee operar com othisvalor delas . Mas eu simplesmente não poderia imaginar que issosuperfosse especificado para funcionar dessa maneira. Eu pensei emsuperser aproximadamente equivalente athis.__proto__.__proto__, entãosuper.__proto__teria sido equivalente aothis.__proto__.__proto__.__proto__que teria exibido o comportamento que eu estava esperando. Você sabe onde, nas especificações, o comportamento exato desuperé especificado?