Модификаторы доступа

Последнее обновление: 16.05.2021

Модификаторы доступа позволяют сокрыть состояние объекта от внешнего доступа и управлять доступом к этому состоянию. В TypeScript три модификатора: public, protected и private.

Если к свойствам и функциям классов не применяется модификатор, то такие свойства и функции расцениваются как будто они определены с модификатором public. То есть следующее определение класса:

class Person {
    
    name: string;
    year: number;
}

Будет эквивалентно:

class Person {
    
    public name: string;
    public year: number;
}

private

Если же к свойствам и методам применяется модификатор private, то к ним нельзя будет обратиться извне при создании объекта данного класса.

Например, создадим класс с приватными свойствами и методами:

class Person {
     
    private _name: string;
    private _year: number;
 
    constructor(name: string, age: number) {
 
        this._name = name;
        this._year = this.setYear(age);
    }
    public print(): void {
        console.log(`Имя: ${this._name}  Год рождения: ${this._year}`);
    }
 
    private setYear(age: number): number {
 
        return new Date().getFullYear() - age;
    }
}
 
let tom = new Person("Tom", 24);
tom.print();
// console.log(tom._name); // нельзя обратиться, так как _name - private
// tom.setYear(45); // нельзя обратиться, так как функция - private

Два свойства _name и _year используются с модификатором private, поэтому мы не можем их использовать вне класса, например, console.log(tom._name). То же самое относится к функции setYear(). Остальные функции доступны.

protected

Модификатор protected определяет поля и методы, которые из вне класса видны только в классах-наследниках:

class Person {
    protected name: string;
    private year: number;
    constructor(name: string, age: number) {
 
        this.name = name;
        this.year = this.setYear(age);
    }
    protected printPerson(): void {

        console.log(`Имя: ${this.name}  Год рождения: ${this.year}`);
    }
	private setYear(age: number): number {
 
        return new Date().getFullYear() - age;
    }
}
class Employee extends Person {

    protected company: string;
    constructor(name: string, age: number, company: string) {
        super(name, age);
        this.company = company;
    }
    public printEmployee(): void {
        //console.log("Year: " + this.year);	// поле year недоступно, так как private
		// setYear(25);							// метод setYear недоступен, так как private
		this.printPerson();						// метод printPerson доступен, так как protected
        console.log(`Компания: ${this.company}`);
    }
}

let sam = new Employee("Sam", 31, "Microsoft");
sam.printEmployee();

В классе Employee будет доступно поле name, а также метод printPerson(), так как они имеют модификатор protected. А вот приватное свойство year и приватный метод setYear() будут недоступны.

Определение полей через конструктор

Использование модификаторов в параметрах конструктора позволяет сократить написание кода. Например, пусть у нас есть следующий класс:

class Person {
    
    private name: string;
    private age: number;

    constructor(name: string, age: number) {

        this.name = name;
        this.age = age;
    }
	printPerson(): void {

        console.log(`Имя: ${this.name}  Возраст: ${this.age}`);
    }
}

Этот класс будет аналогичен следующему:

class Person {
    
    constructor(private name: string, private age: number) {  }
	
	printPerson(): void {

        console.log(`Имя: ${this.name}  Возраст: ${this.age}`);
    }
}

Используя модификаторы в параметрах конструктора, нам больше не надо явно создать свойства для этих параметров. Свойства создаются автоматически, называются они по имени параметров и имеют те же модификаторы, что и параметры.

Подобным образом, если мы хотим сделать свойства публичными, то следует использовать модификатор public:

class Person {
    
    constructor(public name: string, public age: number) {  }
	
	printPerson(): void {

        console.log(`Имя: ${this.name}  Возраст: ${this.age}`);
    }
}

Если необходимо сделать поле для чтения, то к модификатору доступа добавляется модификатор readonly:

class Person {
    
    constructor(private readonly name: string, private age: number) {  }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850