Закрытые поля, определенные спецификацией ECMAScript¶
Помимо сокрытия полей класса от внешней среды с помощью модификатора доступа private, присущего исключительно TypeScript, существует возможность прибегнуть к механизму, предусмотренному спецификацией ECMAScript.
Нативный закрытый (private) модификатор доступа¶
Для того чтобы поля класса оставались закрытыми после компиляции в JavaScript, необходимо прибегнуть к модификатору, определенному спецификацией ECMAScript #, который указывается в качестве префикса их идентификаторов (имен) #identifier.
Доступ к защищенному полю класса ограничивается областью видимости класса, в котором оно объявлено, а при обращении к нему необходимо также указывать символ решетки.
1 2 3 4 5 6 7 8 9 10 | |
Поскольку доступ ограничивается областью видимости класса, потомки не могут обращаться к защищенным полям своих предков.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
В отличие от модификатора доступа private, этот механизм не может быть применён к методам и акссесорам класса, но так как за его появлением стоит спецификация ECMAScript, то он продолжает действовать в скомпилированной программе. Именно поэтому, в отличие от сценария с модификатором доступа private, потомки могут без страха нарушить ожидаемый ход выполнения программы и объявлять защищенные поля, чьи идентификаторы идентичны объявлениям в их супер-классах.
Сценарий с модификатором доступа private:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Сценарий с защищенными полями, предусмотренными спецификацией ECMAScript:
1 2 3 4 5 6 7 8 9 10 | |
И в заключение, стоит упомянуть, что существует несколько нюансов — один из них заключается в том, что закрытые поля нельзя объявлять непосредственно в конструкторе.
1 2 3 4 | |
Другой нюанс связан с тем, что код, содержащий закрытые поля класса, может быть скомпилирован исключительно в версии es6 и выше.