[英]transform-class-properties plugin in React Enzyme shallow rendering
[英]Cannot use child class' properties within parent class constructor via Babel's transform-class-properties
当扩展父类并通过Babel的'transform-class-properties'插件声明子类的属性时,子类的任何类属性都不能通过父类的构造函数方法访问。
class One {
internal = 1;
constructor() {
console.log('constructor internal', this.internal);
}
}
class Two extends One {
internal = 2;
}
new Two();
在上面的示例中,'constructor internal 1'将输出到控制台。 在查看已编译的代码时,这显然是为什么,首先执行父类,然后将结果对象与子类集成。
如果这是设计的道歉,但它让我困惑,因为下面的代码按照我在非构造函数方法中期望的方式工作(因此boot()方法引用子类''internal'属性值):
class One {
internal = 1;
constructor() {
console.log('constructor internal', this.internal);
}
boot() {
console.log('boot internal', this.internal);
}
}
class Two extends One {
internal = 2;
constructor() {
super();
this.boot();
}
}
new Two();
因此,即使在调用父类声明的方法时,它也将继承子类的属性。 它只是构造函数方法,似乎没有按预期行事(至少我是 - 再次,如果这被错误地解释,道歉,但在相对的Babel页面上没有列出任何警告。)
谢谢。
我觉得这很自然。 如果要覆盖父类的属性init值,则应在派生类的构造函数中执行此操作。
class Two extends One {
constructor() {
// Call parent constructor.
super();
// Override here.
this.internal = 2;
}
}
希望能帮助到你。 快乐编码(:
loganfsmyth在这里非常清楚地回答了我的问题: https ://phabricator.babeljs.io/T7567(谢谢!)
这确实是预期的行为。 Babel的实现有点不正确,因为在一个完美的世界中,这也会引发错误,因为你不应该在父母和孩子中定义相同的属性,但我们现在不这样做。
在以下情况下初始化类属性:
对于基类,在构造函数执行之前
对于子类,在super()结束时
当给定的构造函数初始化它的绑定时,它使用该类绑定,它不知道子类中的任何内容。 这意味着你的One类知道值应该是1,所以这就是它设置的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.