Görünüşe göre JavaScript (ES6) Sınıflarında super.__proto__ === this.__proto__.
Neden böyle olduğunu açıklayabilir misiniz? Davranış farklı tarayıcılarda tutarlı görünüyor, bu yüzden bu özellikte bir yerde belirtildiğinden şüpheleniyorum.
Aşağıdaki kodu göz önünde bulundurun:
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();
Bunu umuyordum super.__proto__.myFunc();işlevini çağırır myFunc()sınıfın Level1ve o super.__proto__ !== this.__proto__. Bunun yerine super.__proto__.myFunc();aslında myFunc()sınıf Level3çağrıları (kendini çağırır) ve daha sonra ikinci çağrıda myFunc()sınıf çağrısı yapar Level2. Bu, super.__proto__ === this.__proto__kodun gösterdiği durumlarda mükemmel bir şekilde anlaşılabilir .
super.__proto__ === this.__proto__Bu örnekte nedenini açıklayabilir misiniz ? Mümkünse, lütfen spesifikasyonun ilgili bölümüne de referans verin.
__proto__aslında erişimci fonksiyonları üzerindeObject.prototypevethisdeğer üzerinde çalışan olmak ile ilgili bir şey olduğundan şüphelendim . Ama bununsuperaslında bu şekilde çalıştığını belirlediğimi düşünmüyorum .superKabaca eşdeğer olduğunu düşündümthis.__proto__.__proto__, bu yüzden beklediğim davranışı sergileyensuper.__proto__eşdeğerthis.__proto__.__proto__.__proto__olurdu. Spesifikasyonda tam davranışının nerede belirtildiğini biliyor musunuzsuper?