Похоже, в 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
?super
, вродеsuper.setFoo('bar')
. Вы бы не хотели, чтобы это работало на прототипе, а не на экземпляре.__proto__
это свойство аксессораObject.prototype
. Когда я попросил ссылку на спецификацию, я имел в виду ссылку на точное поведениеsuper
ключевого слова в сочетании с__proto__
. Смотрите мой предыдущий комментарий.super.setFoo('bar')
было бы, что это эквивалентноthis.__proto__.__proto__.setFoo.call(this, 'bar')
. Итак,super
автоматически вызывает функции с правильнымиthis
.super.__proto__
(в этом способеLevel3
класса) в точности эквивалентноReflect.get(Object.getPrototypeOf(Level3.prototype), "__proto__", this)