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 Level1
e 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.prototype
e operare sul lorothis
valore. Ma non potrei immaginare che insuper
realtà è stato specificato per funzionare in questo modo. Pensavo disuper
essere 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
?