Możesz zobaczyć adnotację/dekorator jako normalne wywołanie funkcji. Do tej funkcji obiekt "Klasa/funkcja" (nie instancja) jest wysyłany w pierwszym parametrze, a parametry (metadane) w drugim argumencie.
Jednak to zależy od implementacji tej funkcji, jeśli coś zostanie dodane np. Do prototypu klasy (zła praktyka/ekspozycja właściwości). Jednak kompilator TypeScript i Angular2 działają inaczej.
Używają one funkcji __decorate
i __metadata
generowanych przez kompilator TypeScript. Dane zostaną dodane za pomocą funkcji Object.defineProperty(). Pakiet odpowiedzialny za to jest Reflect. (który pod maską używa funkcji Object.defineProperty()
w połączeniu z WeakMap
).
Funkcja Reflect.defineMetadata()
służy do ustawiania adnotacji i do uzyskiwania oczywistych wartości Reflect.getMetadata()
.
TLDR;
Aby uzyskać adnotacje z klasy/składnik angular2 masz używać:
Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ...
Aby uzyskać adnotacje z paramaters konstruktora w angular2, trzeba użyć:
Reflect.getMetadata('parameters', ComponentClass); //@Inject()
aby uzyskać adnotacje od nieruchomości w klasie w angular2, trzeba użyć:
Reflect.getMetadata('propMetadata', ComponentClass); //@HostBinding(), @Input(), ...
Ogólna odpowiedź brzmi „to zależy”, dekorator jest tylko czymś, co otacza swoją klasę. Możliwe jest, że wyeksponuje propretty lub nie - tak, jak chce. Nie ma _, aby umożliwić ci dostęp do niego - w rzeczywistości może zignorować przekazany do niego parametr. –