Javascript 从父构造函数调用的重写方法不';不要初始化字段

Javascript 从父构造函数调用的重写方法不';不要初始化字段,javascript,Javascript,问题是: A类{ 价值 构造函数(){ 这个.setUp(); } 设置(){ 这个值=1; } } B类扩展了A类{ 价值2; 构造函数(){ 超级(); } 设置(){ super.setUp(); 这是setUp2(); } 设置2(){ 该值为0.2=5; console.log(this.value2);//但是,该值是在此处分配的。 } } 设b=新b(); console.log(b.value); console.log(b.value2);//但这里value2字段未定义。

问题是:

A类{
价值
构造函数(){
这个.setUp();
}
设置(){
这个值=1;
}
}
B类扩展了A类{
价值2;
构造函数(){
超级();
}
设置(){
super.setUp();
这是setUp2();
}
设置2(){
该值为0.2=5;
console.log(this.value2);//但是,该值是在此处分配的。
}
}
设b=新b();
console.log(b.value);
console.log(b.value2);//但这里value2字段未定义。

我注意到,如果启用ES2015,值2也会显示,但在我的浏览器和应用程序中不会显示(我使用ES6)。有人知道如何解决这个问题吗?

这是从构造函数调用可重写方法通常不是一个好主意的原因之一,正是这种交互有问题

问题不在于
value2
没有设置(正如您在
console.log
中所示,它设置了)。问题是,由于公共字段声明,该值被
未定义的覆盖。你的

value2;
构造中的声明在功能上等同于:

value2 = undefined;
在调用
B
的构造函数中的
super
后,会立即处理该初始化,覆盖在
super
调用期间放置的值
setUp2

解决方案是不从构造函数调用可重写的方法。:-)相反,您可以在构造函数中进行设置,或者在(如果您的环境支持)中进行设置,或者在从构造函数使用的实用程序函数中进行设置(如果您在类中的多个位置需要此逻辑)

因此,简单的方法是使用初始值设定项:

A类{
数值=1;
}
B类扩展了A类{
值2=5;
}
设b=新b();
console.log(b.value);//1.

console.log(b.value2);//5
我遇到了这个问题,我需要重写构造函数或构造函数中的方法来初始化字段,如果可能的话,还需要添加新字段。一些字段必须在其他字段之前通过调用子方法进行初始化。但一切都取决于构造函数不可能重写这一事实,也许有解决它的模式?@etozhekim-添加新字段没有问题,只要您在构造函数中使用初始值设定项或初始化代码来初始化它们。超类字段和子类字段之间不应该存在顺序问题,超类字段总是在子类字段之前初始化,这是关系的本质。如果不从构造函数调用这些方法,重写方法也没有问题。“我不确定你要的是什么问题……?@etozhekim-但我在最后添加了第四个示例,这可能就是你要问的问题。如果没有,尽管告诉我,并告诉我一些细节,我将很乐意进一步提供帮助。:-)非常感谢你的回答。我将尝试使用私有方法。如果对我没有帮助,我可以稍后给你写一封详细的信吗?因为我花了一整天的时间在这个问题上。@etozhekim-当然,或者用你的问题解决方案发布一个问题,然后ping我让我知道你已经发布了它。那么,即使我不在,其他人也可能会帮忙。快乐编码!