Здається, що в 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
вказана точна поведінка ?