Здається, що в JavaScript (ES6) класи super.__proto__ === this.__proto__.
Чи можете ви пояснити, чому це так? Поведінка здається послідовною у різних браузерах, тому я підозрюю, що це вказано десь у специфікації.
Розглянемо наступний код:
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();
Я б очікував, що це super.__proto__.myFunc();буде називати функцію myFunc()класу Level1і це super.__proto__ !== this.__proto__. Натомість super.__proto__.myFunc();насправді дзвінки myFunc()класу Level3(він називає себе), а потім на другому виклику він називає myFunc()клас Level2. Це цілком зрозуміло, якщо super.__proto__ === this.__proto__це демонструє код.
Чи можете ви пояснити причину, чому super.__proto__ === this.__proto__в цьому прикладі? Якщо можливо, будь ласка, надайте посилання на відповідний розділ специфікації.
__proto__насправді функціонують аксесуариObject.prototypeта працюють на їхthisзначення. Але я просто неsuperміг уявити, що насправді було визначено для роботи таким чином. Я думав,superщо це приблизно рівнозначноthis.__proto__.__proto__, томуsuper.__proto__було б рівнозначно тому,this.__proto__.__proto__.__proto__що проявило б поведінку, на яку я очікував. Чи знаєте ви, де в специфікаціїsuperвказана точна поведінка ?