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

Я пытаюсь понять, как использовать декораторы в очень простом фрагменте кода, поэтому я могу применить эту концепцию к своему более крупному проекту. Следуя статье Адди Османи здесь, я создал простой фрагмент кода. как показано ниже.

Скажем, у меня есть класс под названием Cat с методом meow(), я хочу украсить его журналированием, как показано ниже.

class Cat {
  @logger
  meow() { console.log( ' Meeeoow! ') }
};


function logger(target, key, descriptor) {
  console.log("Cat snarling...");
  return descriptor;
}

const cat = new Cat();
cat.meow();

Когда я пытаюсь выполнить это с интерпретатором Node.js (версия 9.1.0), я получаю следующую ошибку.

/Users/ravindranath/projects/decorators/index.js:2   @logger   ^

SyntaxError: Invalid or unexpected token
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:152:10)
    at Module._compile (module.js:605:28)
    at Object.Module._extensions..js (module.js:652:10)
    at Module.load (module.js:560:32)
    at tryModuleLoad (module.js:503:12)
    at Function.Module._load (module.js:495:3)
    at Function.Module.runMain (module.js:682:10)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:613:3

Итак, мои вопросы:

  1. Поддерживает ли Node.js 9.x синтаксис декоратора? Или это появится в какой-то будущей версии?

  2. Я вижу несколько декораторов на основе express-js на GitHub, но я не могу понять, как создать свой собственный декоратор. Может ли кто-нибудь предоставить простой базовый пример создания собственного декоратора с помощью Node.js?


person Mopparthy Ravindranath    schedule 02.01.2018    source источник
comment
вы можете проверить здесь node.green   -  person Manjeet Thakur    schedule 02.01.2018
comment
Я написал короткую статью о том, как быстро начать работу с этим — dev.to/dpkshma/   -  person Deepak    schedule 06.06.2020


Ответы (1)


Декораторы не являются частью ECMAScript 2016 (он же 7). В настоящее время декораторы находятся на этапе 2 черновика из 4 стадий, через которые проходит функция, прежде чем она будет завершена. и стать частью языка. Вероятно, в ближайшем будущем они будут интегрированы в язык, но его особенности и особенности могут измениться. Из-за этого вам придется использовать транспилятор, такой как Babel, для преобразования декораторов в код, понятный среде выполнения Node (ECMAScript 2016), установив transform-decorators Плагин Babel.

Что касается создания декораторов, вы уже это сделали. Каждый декоратор — это просто функция, обертывающая другую, которая снабжена аргументами в зависимости от варианта использования, в вашем случае target, key и descriptor. Ваша logger функция:

function logger(target, key, descriptor) {
  console.log("Cat snarling...");
  return descriptor;
}

Уже декоратор. Для класса свойств и методов target относится к классу свойства, key — к имени свойства, а descriptor — к дескриптору свойства. Затем вызывается декоратор, и свойство класса определяется через Object.defineProperty после удаления сахара. Ваш пример можно свести к следующему:

class Cat { }

let meowDescriptor = {
  type: 'method',
  initializer: () => () => {
    console.log(' Meeeoow! ');
  },
  enumerable: false,
  configurable: true,
  writable: true
}

function logger(target, key, descriptor) {
  console.log("Cat snarling...");
  return descriptor;
}

meowDescriptor = logger(Cat.prototype, 'meow', meowDescriptor);
Object.defineProperty(Cat.prototype, 'meow', {
  ...meowDescriptor,
  value: meowDescriptor.initializer()
});

Для самих классов декораторы принимают один аргумент, target, который описывает декорированный класс. Я предлагаю прочитать некоторую документацию по теме, чтобы ознакомиться с ней .

person Andrew Li    schedule 02.01.2018
comment
Три года спустя, и он все еще находится на этапе 2 черновика :( Я пишу сервисы Node - я думал, что здесь я буду в безопасности и мне не нужно использовать транспилятор. - person Snake Verde; 13.04.2021