Как я могу использовать декораторы сегодня?

Я вижу декораторы, которые сегодня уже используются в некотором коде javascript. Мой вопрос действительно двоякий.

Первый:

Если декораторы еще даже не доработаны, как их можно использовать в рабочем коде сегодня? Не будет ли поддержки браузера несуществующей?

Второй:

Учитывая, что его можно использовать сегодня, как предлагают некоторые проекты с открытым исходным кодом, какова обычно рекомендуемая настройка для работы декораторов?


person Jacob Baris    schedule 25.12.2015    source источник
comment
Ответ на оба ваших вопроса: babeljs.io .   -  person Felix Kling    schedule 25.12.2015
comment
Все объясняется здесь: medium.com/google-developers/ (см. принятый ответ для справочной информации)   -  person arcseldon    schedule 25.12.2015
comment
kangax.github.io/compat-table/es7 предоставляет информацию о том, какие транспиляторы и браузеры в настоящее время поддерживают использование декораторов (класса)   -  person arcseldon    schedule 25.12.2015


Ответы (3)


Вы правы, декораторы ES2016 еще не являются частью спецификации. Но это не значит, что мы не можем использовать его сегодня.

Сначала давайте сделаем шаг назад и рассмотрим «что такое декоратор». Декораторы — это просто оболочки, добавляющие поведение объекту. Это не новая концепция в javascript (или в программировании в целом), на самом деле она существует уже некоторое время...

Вот базовый пример декоратора, который проверяет разрешения:

function AuthorizationDecorator(protectedFunction) {
    return function() {
        if (user.isTrusted()) {
            protectedFunction();
        } else {
            console.log('Hey! No cheating!');
        }
    }
}

Использование будет выглядеть так:

AuthorizationDecorator(save);

Вы видите, что все, что мы делаем, это просто завершаем какую-то другую функцию. Вы даже можете передать функцию через несколько декораторов, каждый из которых добавляет часть функциональности или запускает некоторый код.

Вы даже можете найти несколько старых статей, объясняющих шаблон декоратора в javascript.

Теперь, когда мы понимаем, что декораторы — это на самом деле то, что мы (сообщество javascript) всегда могли делать, вероятно, вас не шокирует тот факт, что на самом деле, когда мы используем декораторы ES2016 сегодня, они просто компилируются в код ES5, поэтому вы поддерживаете совместимость с браузером. Так что на данный момент это просто синтаксический сахар (я мог бы добавить немного действительно сладкого сахара).

Что касается того, какой компилятор использовать для преобразования кода ES2016 в код ES5, у вас есть несколько вариантов: Babel и Traceur являются наиболее популярными.

Ниже приведены дополнительные материалы по Изучение декораторов ES2016.

person Kirill Fuchs    schedule 25.12.2015

Поддержку декораторов @Class можно включить в Babel/Traceur

Вавилон:

$ babel --optional es7.decorators

Источник: Ознакомление с декораторами ES7 — Medium< /эм>

Трейсер:

traceurOptions: {
  "annotations": true
}

декораторы @Property не поддерживаются

... и поскольку каждый @Property предоставляет уникальную функциональность, для каждого из них требуется свой подход к обессахариванию в ES6/7.

Вот как вы используете @Inject:

Машинопись

exports class ExampleComponent {
  constructor(@Inject(Http) http: Http) {
    this.http = http;
  }
}

ES 6/7

exports class ExampleComponent {
  constructor(http) {
    this.http = http;
  }

  static get parameters() {
    return [[Http]];
  }
}

Источник: https://stackoverflow.com/a/34546344/290340

Обновление:

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

Короче говоря; да вы можете использовать декораторы @Class в ES6/7; никакие декораторы свойств не поддерживаются в ES6/7, поэтому вам придется использовать обходные пути.

person Evan Plaice    schedule 31.12.2015

Есть несколько решений для использования декораторов:

  • babel — компилятор es next to es5 с поддержкой декораторов.
  • traceur — еще один компилятор es рядом с компилятором es5 от Google.
  • typescript — типизированный расширенный набор языка javascript, поддерживающий декораторы.

Есть некоторая разница в том, как эти инструменты транспилируют «современный» javascript в более старый, чтобы вы могли изучить его, если это необходимо, поскольку у них есть онлайн-игровые площадки.

person shadeglare    schedule 25.12.2015