我正在阅读Egghead的React教程,在其中一课中,我发现了以下类声明:
class StopWatch extends React.Component {
state = {lapse: 0, running: false}
render() {
const {lapse, running} = this.state
const buttonStyles = {
border: '1px solid #ccc',
background: '#fff',
fontSize: '2em',
padding: 15,
margin: 5,
width: 200
}
return (
<div style={{textAlign: 'center'}}>
<label style={{fontSize: '5em', display: 'block'}}>
{lapse}ms
</label>
<button style={buttonStyles}>{running ? 'Stop' : 'Start'}</button>
<button style={buttonStyles}>Clear</button>
</div>
)
}
}
因此,看着代码,我只是对顶部的分配感到好奇。我查看了该类并扩展了有关MDN的文档,但它没有说明允许在类声明中进行赋值。
此外,我在示例代码上进行了尝试,并引发了错误:
class Square {
constructor(prop1, prop2) {
this.prop1 = prop1
this.prop2 = prop2
}
}
class Polygon extends Square {
constructor(prop1, prop2, prop3) {
super(prop1, prop2)
}
prop2 = prop3
render() {
console.log(prop2)
}
}
那么...为什么起作用?
最佳答案
子类使用stage 3 proposal的类字段,并且不属于现有标准。它们为构造函数体提供语法糖。如this question中所述,执行类字段分配有特定的顺序。
子类与此ES6类相同(也请检查Babel output以获得一些正在发生的想法):
class Polygon extends Square {
constructor(prop1, prop2, prop3_that_doesnt_collide) {
super(prop1, prop2);
this.prop2 = prop3;
}
render() {
console.log(prop2)
}
}
console.log(prop2)
引用不存在的prop2
变量,而不是prop2
属性。请注意,由于
prop3
位于构造函数方法之外,因此它不是引用prop3
构造函数参数,而是引用一些不存在的prop3
变量,因此prop3_that_doesnt_collide
参数和prop3
不会冲突。由于
prop2
分配依赖于构造函数参数,因此应将其放置在构造函数方法内:class Polygon extends Square {
constructor(prop1, prop2, prop3) {
super(prop1, prop2);
this.prop2 = prop3;
}
render() {
console.log(this.prop2)
}
}
由于它只是立即将
prop2
值替换为prop3
,因此可以是:constructor(prop1, prop2, prop3) {
super(prop1, prop3);
}