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 Level1
và đó 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.prototype
và hoạt động dựa trênthis
giá trị của chúng . Nhưng tôi chỉ không tưởng tượng rằng nósuper
thực sự được chỉ định để làm việc theo cách này. Tôi nghĩ rằngsuper
nó 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ơisuper
cụ thể hành vi chính xác được chỉ định?