Вы можете увидеть аннотацию/декоратор как обычный вызов функции. К этой функции объект «Класс/Функция» (не экземпляр) получает посылку в первом параметре и параметры (метаданные) во втором аргументе.
Однако это зависит от реализации этой функции, если что-то добавляется, например, к прототипу класса (свойство плохой практики/экспонирования). Компилятор TypeScript и Angular2 делают все по-другому.
Они используют функции __decorate
и __metadata
, которые генерируются компилятором TypeScript. Данные добавляются с помощью функции Object.defineProperty(). Пакет, ответственный за это, - Reflect. (который под капотом использует функцию Object.defineProperty()
в сочетании с WeakMap
).
Функция Reflect.defineMetadata()
используется для установки аннотаций и получения их очевидного Reflect.getMetadata()
.
TLDR;
Чтобы получить аннотации из класса/компоненты в angular2, у вас есть использовать:
Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ...
Чтобы получить аннотации из конструктора PARAMATERS в angular2, вы должны использовать:
Reflect.getMetadata('parameters', ComponentClass); //@Inject()
чтобы получить аннотации из свойства в классе в angular2, вы должны использовать:
Reflect.getMetadata('propMetadata', ComponentClass); //@HostBinding(), @Input(), ...
Общий ответ: «это зависит», декоратор является только то, что оборачивает свой класс. Это возможно для того, чтобы выявить правопреемника или нет - как он выбирает. Это не означает, что вы имеете доступ к нему - на самом деле он может вообще игнорировать переданный ему параметр. –