【发布时间】:2020-10-26 13:48:50
【问题描述】:
在从父构造函数分配类字段的情况下,我试图了解为什么以下解决方案doesn't work 的动态:
class B{
constructor(val){
this.a = val;
}
}
class A extends B{
a;
constructor(val){
super(val);
}
}
通过上述调用new A(1) 将返回一个实例,而A.a 是undefined。
如果分配是通过命名function 而不是超级constructor 实现will work:
class B{
assignMe(val){
this.a = val;
}
}
class A extends B{
a;
constructor(val){
super(null);
super.assignMe(val);
}
}
这会正确设置A.a = 1。
这里有一个more complex implementation,它代表了我的真实使用场景。
为什么我不能使用constructor 来实现这一点?
【问题讨论】:
-
您这样做是为了解决什么问题?从表面上看,让超类分配给子类声明的属性是一种反模式。
-
@T.J.Crowder 在我的真实场景中它不会分配给子类属性。即使
class B包含字段a,它仍然不起作用。 -
如果
B有a并且A没有,则它会这样做,如果B负责初始化a,这就是您所期望的。 -
如果您查看 Babel 对该代码的操作,在
super()调用之后,属性“a”在 A 构造函数中被初始化为undefined。这就是让 A 定义属性而不是 B 的语义。 -
playcode.io/697224 这是真实世界的场景
标签: javascript oop ecmascript-6