Il semble que dans les classes JavaScript (ES6) super.__proto__ === this.__proto__.
Pouvez-vous expliquer pourquoi c'est le cas? Le comportement semble cohérent entre les différents navigateurs, donc je soupçonne que cela est spécifié quelque part dans la spécification.
Considérez le code suivant:
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();
Je me serais attendu à ce que super.__proto__.myFunc();cela appelle la fonction myFunc()de classe Level1et cela super.__proto__ !== this.__proto__. Au lieu de cela, il super.__proto__.myFunc();appelle en fait la myFunc()classe Level3(il s'appelle lui-même), puis lors de la deuxième invocation, il appelle la myFunc()classe Level2. Ceci est parfaitement compréhensible si super.__proto__ === this.__proto__le code le démontre.
Pouvez-vous expliquer la raison pour laquelle super.__proto__ === this.__proto__dans cet exemple? Si possible, veuillez également fournir des références à la section pertinente de la spécification.
__proto__fait d'être des fonctions d'accesseurObject.prototypeet de fonctionner sur leurthisvaleur. Mais je ne pouvais tout simplement pas imaginer que celasuperétait réellement spécifié pour fonctionner de cette façon. Je pensaissuperêtre à peu près équivalent àthis.__proto__.__proto__, doncsuper.__proto__aurait été équivalent àthis.__proto__.__proto__.__proto__ce qui aurait montré le comportement que j'attendais. Savez-vous où, dans la spécification, le comportement exact desuperest spécifié?