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 Level1
e 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.prototype
e operar com othis
valor delas . Mas eu simplesmente não poderia imaginar que issosuper
fosse especificado para funcionar dessa maneira. Eu pensei emsuper
ser 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?