猿问

为什么在 JavaScript 中是真的?

似乎在 JavaScript (ES6) Classes 中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()class的函数,Level1而super.__proto__ !== this.__proto__. 相反,super.__proto__.myFunc();实际上调用myFunc()class Level3(它调用自己),然后在第二次调用时调用myFunc()class Level2。如果super.__proto__ === this.__proto__代码演示了这一点,这是完全可以理解的。


你能解释一下super.__proto__ === this.__proto__这个例子中的原因吗?如果可能,还请提供对规范相关部分的参考。


一只甜甜圈
浏览 111回答 1
1回答

弑天下

Object.prototype.__proto__是一个带有 getter [1]的属性。它以其this价值运作。没有实际的super对象是一个this值(你不能写Object.getPrototypeOf(super)),只是一种super查找属性的方式,所以只要没有在原型链的较低位置定义,this.__proto__并且super.__proto__意味着相同的东西__proto__。相比:class Parent {    get notProto() {        return this instanceof Child;    }}class Child extends Parent {    test() {        console.log(super.notProto);    }}new Child().test();// bonus: [1]console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答