Sembra che nelle classi JavaScript (ES6) super.__proto__ === this.__proto__.
Puoi spiegare perché è così? Il comportamento sembra coerente su diversi browser, quindi sospetto che questo sia specificato da qualche parte nelle specifiche.
Considera il seguente codice:
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();
Mi sarei aspettato che super.__proto__.myFunc();avrebbe chiamato la funzione myFunc()di classe Level1e quella super.__proto__ !== this.__proto__. Invece in super.__proto__.myFunc();realtà chiama myFunc()di classe Level3(chiama se stesso) e quindi nella seconda chiamata chiama myFunc()di classe Level2. Ciò è perfettamente comprensibile se super.__proto__ === this.__proto__dimostra il codice.
Puoi spiegare il motivo per cui super.__proto__ === this.__proto__in questo esempio? Se possibile, fornire anche riferimenti alla sezione pertinente delle specifiche.
__proto__essere effettivamente funzioni di accessoObject.prototypee operare sul lorothisvalore. Ma non potrei immaginare che insuperrealtà è stato specificato per funzionare in questo modo. Pensavo disuperessere approssimativamente equivalente athis.__proto__.__proto__, quindisuper.__proto__sarebbe stato equivalente a quellothis.__proto__.__proto__.__proto__che avrebbe mostrato il comportamento che mi aspettavo. Sai, dove nelle specifiche è specificato il comportamento esattosuper?