В стандарте 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-метод