Присваивание внутри объявления подкласса - React.Component

Я изучаю учебник Egghead's 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)
        }
    }

Итак... почему это работает?

2 ответа

Решение

Подкласс использует поля класса, которые являются предложением стадии 3 и не являются частью существующего стандарта. Они обеспечивают синтаксический сахар для тела конструктора. Как объясняется в этом вопросе, существует определенный порядок, в котором выполняются назначения полей класса.

Подкласс идентичен этому классу ES6 (проверьте также вывод Babel, чтобы получить некоторые идеи о том, что происходит):

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);
}

Синтаксис, который вы пытаетесь использовать, не стандартизирован, и вам понадобится Babel для переноса кода. В качестве альтернативы вы можете использовать статические члены в классах -

let Foo = class {
  static get staticData() {
    return 'Static Data';
  }
}

console.log(Foo.staticData);
Другие вопросы по тегам