В стандарте JavaScript ECMAScript 5 была предложена концепция методов доступа: для доступа к свойству определяется пара методов - get-метод для получения значения свойства и set-метод для установки значения. Это довольно распространенная концепция, которая нашла свое применение, например, в Java, где для управления доступом к приватным переменным создается пара методов - get/set, или в C#, где для доступа к приватным переменным создается свойство с двумя методами get/set.
К примеру, у нас есть следующий класс:
class Person { name: string; age: number; } let tom = new Person(); tom.name = "Tom"; tom.age = -1243; console.log(tom.age);
Здесь полю age
, которое представляет условный возраст человека, присваивается некорретное значение.
Использование аксессоров или методов доступа позволяет управлять тем, как значение устанавливается и как оно возвращается. В частности, мы можем переписать предыдущих класс с использованием акссессоров следующим образом:
class Person { name: string; private _age: number; private _name: string; public get age(): number { return this._age; } public set age(n: number) { if(n < 0 || n > 110){ console.log("Недопустимый возраст!"); } else{ this._age = n; } } } let tom = new Person(); tom.name = "Tom"; tom.age = 36; console.log(tom.age); // 36 tom.age = -1243; // Недопустимый возраст! console.log(tom.age); // 36
Методы доступа определяются как обычные методы, только перед ними ставятся ключевые слова get/set. Set-метод контроллирует установку значения, а get-метод возвращает значение.
В данном случае мы опосредовали доступ к переменной _age
, сделав ее приватной. Теперь к ней можно обратиться только через методы доступа.
Метод get
просто возвращает значение переменной:
public get age(): number { return this._age; }
А метод set
устанавливает значение _age
, но только в том случае, если оно укладывается в корректный диапазон.
Когда мы присваиваем значение:
tom.age = 36;
срабатывает set-метод
Когда мы получаем значение:
console.log(tom.age);
срабатывает get-метод