Я изучал React и использовал классы ES6 для написания своих компонентов на основе классов. Я работаю над небольшим проектом Node, и ни один из этих синтаксисов не работает.
class Handler {
handleReq = () => {
this.ctx = ctx;
};
testFunc = async () => {
};
}
export default (HandleReq = Handler.prototype.handleReq);
Что не так с этим синтаксисом? Он не работает в узле? Мне пришлось установить esm, чтобы синтаксис импорта/экспорта работал правильно, но это все еще не компилируется.
Попался, что люди обычно делают в наши дни, чтобы получить такие вещи? Они пишут код в старом стиле?
И Handler.prototype.handleReq никогда не будет работать, так как handleReq должен быть привязан к экземпляру, поэтому он будет существовать только в экземпляре ((new Handler).handleReq)
@JonasWilms Отлично, спасибо за информацию!
нет, писать JS в старом стиле просто больно, вот почему большинство людей используют конвейер сборки (я использую Webpack с BabelJS, Typescript и UglifyJS)
testFunc = async () => { }; выдаст ошибку Unexpected token =@JohnLippson Да, они просто используют обычные методы class или помещают функции стрелок в конструктор, где они должны быть. Вы, кажется, не опубликовали свой полный код, но я сомневаюсь, что вам вообще нужны стрелочные функции.
Чего должен добиться export default (HandleReq = Handler.prototype.handleReq);? Помимо создания исключения при назначении необъявленной глобальной переменной, зачем вы вообще используете class, если все, что вы когда-либо экспортировали, — это один метод?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поля класса все еще находятся на стадии предложения (уже на стадии 3, поэтому скоро они станут частью языка). Это означает, что некоторые среды выполнения могут уже поддерживать их, но пока это не обязательно. Чтобы надежно использовать предложения сегодня, вы должны преобразовать их с помощью BabelJS.
Это перенесет ваш код в следующий ES6:
class Handler {
constructor() {
this.handleReq = () => {
this.ctx = ctx;
};
this.testFunc = async () => {
};
}
}
поэтому эти методы на самом деле существуют только в экземпляре после построения, а не в Handler.prototype.
Как указывали другие, поля класса еще не являются частью синтаксиса ES6 без транспиляции. Если вы хотите избежать шага сборки, эквивалентный синтаксис узла:
// import someImport from './some-import' is invalid, instead use:
const someImport = require('./some-import');
class Handler {
constructor() {
this.handleReq = this.handleReq.bind(this);
this.testFunc = this.testFunc.bind(this);
}
handleReq() {
this.ctx = ctx; // Where is ctx coming from?
}
async testFunc() {
}
}
// export default Handler.prototype.handleReq is invalid, instead use:
module.exports = Handler.prototype.handleReq;
Свойства класса еще не являются действительными ES, они находятся на стадии предложения. Вы должны использовать транспилятор, например BabelJS, чтобы работать с ними сегодня.,