Как я могу использовать декораторы сегодня?
Я вижу декораторы, используемые сегодня уже в некотором коде JavaScript. Мой вопрос действительно в два раза.
Первый:
Если декораторы даже не были доработаны, как их можно использовать в производственном коде, сегодня? Разве поддержка браузера не будет отсутствовать?
Во-вторых:
Учитывая, что сегодня его можно использовать, как предлагают некоторые проекты с открытым исходным кодом, какова обычно рекомендуемая установка для работы декораторов?
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.
@Class
поддержка декораторов может быть включена в Babel/Traceur
Бабель:
$ babel --optional es7.decorators
Источник: Экспорт ES7 Декораторы - Средний
Traceur:
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]];
}
}
Источник: /questions/39954243/kak-vnedrit-sluzhbu-angular2-http-v-klass-es67/39954254#39954254
Обновить:
Похоже, Бабель изменил способ настройки декораторов, и статья устарела. Вот ссылка на новый подход.
Короче; да, вы можете использовать @Class
декораторы в ES6/7; никакие декораторы свойств не поддерживаются в ES6 / 7, поэтому вам придется использовать обходные пути.
Есть несколько решений для использования декораторов:
- babel - es рядом с компилятором es5 с поддержкой декораторов.
- traceur - еще один es рядом с компилятором es5 от Google.
- typcript - типизированный надмножество языка javascript, который поддерживает декораторы.
Есть некоторая разница в том, как эти инструменты переносят "современный" javascript к более старому, чтобы вы могли изучить его при необходимости, так как у них есть игровые площадки онлайн.