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()にclassを呼び出しLevel3(それ自体を呼び出し)、2番目の呼び出し時myFunc()にclassを呼び出します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指定されているか知っていますか?