javascript es6 super 不理解
本人新手, 最近在看阮一峰老师的es6
里面class
的继承这一章, 对super
一些概念不理解, 具体如下:
在阮一峰老师的博客里有这样一段代码:
class A {
constructor() {
this.x = 1;
}
}
class B extends A {
constructor() {
super();
this.x = 2;
super.x = 3;
console.log(this.x); // 3
}
}
let b = new B();
阮一峰老师是这么说的
由于this
指向子类实例,所以如果通过super
对某个属性赋值,这时super
就是this
,赋值的属性会变成子类实例的属性。
上面代码中,super.x
赋值为3
,这时等同于对this.x
赋值为3
这里我很不理解, 为什么使用super.x
进行赋值以后就等同于this.x
,
我的理解是:
根据阮一峰老师前面说的
super
作为对象时,在普通方法中,指向父类的原型对象
那么这里的super.x = 3
实际上应该就是A.prototype.x = 3
, 那么对于子类B
应该是没有影响的, 所以个人理解结果应该是2
但是浏览器跑出来的结果却和阮老师的结果一样是3
, 所以请问应该如何理解
希望能有前辈给一个清晰的解答, 谢谢了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
题主看书看仔细些
这两句话连在一起,不矛盾!意思就是:
意思是:
super
指向父类的原型对象,但是父类的方法中的this
指向当前的子类实例。这里
super
指向父类的原型对象,没错!但是底层并不是直接执行
而是转换了底层的
this
,最终效果类似于:代码验证:
你再看看阮老师举的函数调用的例子,这个例子就更清楚了,因为函数可以用
call
代码:
super.print()
等价于super.print.call(this)
,因为底层隐含转换了this
所以,最终有了下面的解释:
调用super() 时会在类中生成一个新的上下文this, 所以阮说给super赋值,就是赋值给this,实际开发中并不应该给super赋值,super 关键字用于调用对象的父对象上的
函数
。这样看的话就好理解了啊,在对super进行某个属性赋值时,这个时候 super 就是 this,在别的时候,super 指向的应该是父类,这样就可以解释了。
super()并不是通过prototype实现继承的,而是类似于传统的class方式来实现。也就是子类不能修改父类的属性。我猜想,当 super.x = 3 时,会将3赋值给this,然后删除了super.x。由此无法反向给父类赋值
前几天刚好在学习这个,看到文档里得出3我也很疑惑,自己运行了一下发现是等于2的,难道只有我一个人得出了2?
控制台:
个人理解和题主一样,super指向的就是父类的原型对象,所以在super.x上赋值,不会影响到指向实例对象的this,所以应该还是2,实际运行结果也是2。
为什么有人得到2有人得到3,可能是es版本的原因,具体还需仔细研究,希望明白的大神不吝赐教。
只说说个人理解,仅供参考;阮一峰老师说了:
1、在子类普通方法中通过
super
调用父类的方法时,方法内部的this
指向当前的子类实例。2、个人理解在super.x=3 的时候,其实并不是直接赋值的,而是调用了super对象内的的set函数,该方法里改变this指向了当前实例。
3、super本身没有set/get,不过他却继承了object的get/set方法
我并不理解
super
的具体实现,但是按照这逻辑加了一句代码,结果显然是不成立。弱弱的怀疑一下这不是通过现象反猜的吧?