为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在 JavaScript 中是真的?

为什么在 JavaScript 中是真的?

一只甜甜圈 2021-11-18 15:42:37
似乎在 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__这个例子中的原因吗?如果可能,还请提供对规范相关部分的参考。
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

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__'));


查看完整回答
反对 回复 2021-11-18
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信