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
指定されているか知っていますか?