Классы ES6 и использование функций в узле

Я изучал React и использовал классы ES6 для написания своих компонентов на основе классов. Я работаю над небольшим проектом Node, и ни один из этих синтаксисов не работает.

class Handler {
  handleReq = () => {
    this.ctx = ctx;
  };

  testFunc = async () => {

  };
}

export default (HandleReq = Handler.prototype.handleReq);

Что не так с этим синтаксисом? Он не работает в узле? Мне пришлось установить esm, чтобы синтаксис импорта/экспорта работал правильно, но это все еще не компилируется.

Свойства класса еще не являются действительными ES, они находятся на стадии предложения. Вы должны использовать транспилятор, например BabelJS, чтобы работать с ними сегодня.,

Jonas Wilms 02.03.2019 20:38

Попался, что люди обычно делают в наши дни, чтобы получить такие вещи? Они пишут код в старом стиле?

John Lippson 02.03.2019 20:39

И Handler.prototype.handleReq никогда не будет работать, так как handleReq должен быть привязан к экземпляру, поэтому он будет существовать только в экземпляре ((new Handler).handleReq)

Jonas Wilms 02.03.2019 20:40

@JonasWilms Отлично, спасибо за информацию!

John Lippson 02.03.2019 20:40

нет, писать JS в старом стиле просто больно, вот почему большинство людей используют конвейер сборки (я использую Webpack с BabelJS, Typescript и UglifyJS)

Jonas Wilms 02.03.2019 20:41
testFunc = async () => { }; выдаст ошибку Unexpected token =
Maheer Ali 02.03.2019 20:41

@JohnLippson Да, они просто используют обычные методы class или помещают функции стрелок в конструктор, где они должны быть. Вы, кажется, не опубликовали свой полный код, но я сомневаюсь, что вам вообще нужны стрелочные функции.

Bergi 02.03.2019 20:47

Чего должен добиться export default (HandleReq = Handler.prototype.handleReq);? Помимо создания исключения при назначении необъявленной глобальной переменной, зачем вы вообще используете class, если все, что вы когда-либо экспортировали, — это один метод?

Bergi 02.03.2019 20:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
58
2

Ответы 2

Поля класса все еще находятся на стадии предложения (уже на стадии 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;

Другие вопросы по теме