Có vẻ như trong các lớp JavaScript (ES6) super.__proto__ === this.__proto__.
Bạn có thể giải thích tại sao đây là trường hợp? Hành vi có vẻ nhất quán trên các trình duyệt khác nhau, vì vậy tôi nghi ngờ điều này được chỉ định ở đâu đó trong thông số kỹ thuật.
Hãy xem xét các mã sau đây:
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();
Tôi đã mong đợi rằng super.__proto__.myFunc();sẽ gọi chức năng myFunc()của lớp Level1và đó super.__proto__ !== this.__proto__. Thay vào đó super.__proto__.myFunc();thực sự gọi myFunc()các lớp Level3(nó gọi chính nó) và sau đó trong lần gọi thứ hai, nó gọi myFunc()lớp Level2. Điều này là hoàn toàn dễ hiểu nếu super.__proto__ === this.__proto__mã mà chứng minh.
Bạn có thể giải thích lý do tại sao super.__proto__ === this.__proto__trong ví dụ này? Nếu có thể, vui lòng cung cấp tài liệu tham khảo cho phần có liên quan của thông số kỹ thuật.
__proto__thực sự là các hàm truy cậpObject.prototypevà hoạt động dựa trênthisgiá trị của chúng . Nhưng tôi chỉ không tưởng tượng rằng nósuperthực sự được chỉ định để làm việc theo cách này. Tôi nghĩ rằngsupernó gần tương đương vớithis.__proto__.__proto__, vì vậysuper.__proto__sẽ tương đương vớithis.__proto__.__proto__.__proto__hành vi mà tôi mong đợi. Bạn có biết, nơisupercụ thể hành vi chính xác được chỉ định?