本人新手, 最近在看阮一峰老师的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
, 所以请问应该如何理解
希望能有前辈给一个清晰的解答, 谢谢了!
题主看书看仔细些
这两句话连在一起,不矛盾!意思就是:
意思是:
super
指向父类的原型对象,但是父类的方法中的this
指向当前的子类实例。这里
super
指向父类的原型对象,没错!但是底层并不是直接执行
而是转换了底层的
this
,最终效果类似于:代码验证:
你再看看阮老师举的函数调用的例子,这个例子就更清楚了,因为函数可以用
call
代码:
super.print()
等价于super.print.call(this)
,因为底层隐含转换了this
所以,最终有了下面的解释: