Закрытые поля, определенные спецификацией 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
и выше.