Wygląda na to, że w klasach JavaScript (ES6) super.__proto__ === this.__proto__.
Czy możesz wyjaśnić, dlaczego tak jest? Zachowanie wydaje się spójne w różnych przeglądarkach, więc podejrzewam, że jest to określone gdzieś w specyfikacji.
Rozważ następujący kod:
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();
Spodziewałbym się, super.__proto__.myFunc();że nazwałoby to funkcję myFunc()klasy Level1i to super.__proto__ !== this.__proto__. Zamiast tego super.__proto__.myFunc();faktycznie wywołuje myFunc()klasę Level3(sama się nazywa), a następnie przy drugim wywołaniu wywołuje myFunc()klasę Level2. Jest to całkowicie zrozumiałe, jeśli super.__proto__ === this.__proto__pokazuje to kod.
Czy możesz wyjaśnić powód, dla którego super.__proto__ === this.__proto__w tym przykładzie? Jeśli to możliwe, proszę również podać odniesienia do odpowiedniej sekcji specyfikacji.
__proto__funkcje akcesora działająObject.prototypei działają na ichthiswartości. Ale po prostu nie mogę sobie wyobrazić, żesupertak naprawdę działało w ten sposób. Myślałem, że będęsupermniej więcej równorzędnythis.__proto__.__proto__, więcsuper.__proto__byłby równoważny zthis.__proto__.__proto__.__proto__tym, co pokazałoby zachowanie, którego się spodziewałem. Czy wiesz, gdzie w specyfikacjisuperpodano dokładne zachowanie ?