我正在阅读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)
}
}
那么......为什么会这样?
答案 0 :(得分:1)
子类使用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);
}
答案 1 :(得分:0)
您尝试使用的语法不是标准化的,您需要让Babel转换您的代码。或者,您可以在类中使用静态成员 -
let Foo = class {
static get staticData() {
return 'Static Data';
}
}
console.log(Foo.staticData);