Angular 6.
Доброго времени суток. Изучая Angular столкнулся с таким случаем:
import { Component, Inject, OnInit } from '@angular/core';
import { DOCUMENT } from '@angular/common';
@Component({
selector: 'app-root',
template: "<div>Test</div>"
})
export class AppComponent implements OnInit {
x = DOCUMENT;
constructor(@Inject(DOCUMENT) private y){
}
ngOnInit(){
console.log(this.x);
console.log(this.y);
}
}
Первый log выводит: InjectionToken{...}
Второй log выводит: #document - то есть ссылку на глобальный объект.
Если попытатся создать экземпляр класса через new DOCUMENT(), вполне справедливо ругается, что невозможно использовать new с выражением у которого нет конструктора. То-есть DOCUMENT не функция, и не класс, а просто объект записанный в константу.
Собственно вопрос: что происходит с DOCUMENT в constructor, что он меняет значение? Всегда считал (видимо ошибочно), что при выполнении dependency injection создается экземпляр класса. Но по всем признакам это просто обьект, а не функция конструктор, или класс. Так что же за колдунство там творится?
Интересует именно внутренняя механика Angular, я прекрасно знаю, что в работе просто используем DI, и улыбаемся. Но хочется понимать глубже.