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.
fonte
__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?super
, comosuper.setFoo('bar')
. Você não gostaria que isso funcionasse em um protótipo em vez da instância.__proto__
é uma propriedade acessoraObject.prototype
. Quando pedi uma referência às especificações, quis dizer uma referência ao comportamento exato dasuper
palavra - chave em conjunto com__proto__
. Veja meu comentário anterior.super.setFoo('bar')
seria que isso é equivalente athis.__proto__.__proto__.setFoo.call(this, 'bar')
. Portanto,super
invoca automaticamente as funções com o corretothis
.super.__proto__
(em que o método daLevel3
classe) é exatamente equivalente aReflect.get(Object.getPrototypeOf(Level3.prototype), "__proto__", this)