Объектно-ориентированное программирование

Классы

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

TypeScript реализует объектно-ориентированный подход, в нем есть полноценная поддержка классов. Класс представляет шаблон для создания объектов и инкапсулирует функциональность, которую должен иметь объект. Класс определяет состояние и поведение, которыми обладает объект.

Для определения нового класса применяется ключевое слово class. Например, определим класс User:

class User {}

После определения класса мы можем создавать его объекты:

let tom: User = new User();
let alice = new User();

Здесь определено два объекта класса User - tom и alice.

Поля класса

Для хранения состояния объекта в классе определяются поля:

class User {
 
    name: string;
    age: number;
}

Здесь определены два поля - name и age, которые имеют типы string и number соответственно. Фактически поля представляют переменные уровня класса, только для их объявления не применяются var и let.

По имени объекта мы можем обращаться к этим полям:

class User {
 
    name: string;
    age: number;
}

let tom = new User();
tom.name = "Tom";
tom.age = 36;
console.log(`name: ${tom.name}  age: ${tom.age}`);	// name: Tom  age: 36

При определении полей им можно задать некоторые начальные значения:

class User {
 
    name: string = "Tom Smith";
    age: number = 18;
}

let user = new User();
console.log(`name: ${user.name}  age: ${user.age}`);	// name: Tom Smith  age: 18

Методы

Классы также могут определять поведение - некоторые действия, которые должны выполнять объекты этого класса. Для этого внутри класса определяются функции, которые называются методами.

class User {
 
    name: string;
    age: number;
	print(){
        console.log(`name: ${this.name}  age: ${this.age}`);
    }
	toString(): string{
		return `${this.name}: ${this.age}`;
	}
}

Здесь в классе User определены два метода. Метод print() выводит информацию об объекте на консоль, а метод toString() возвращает некоторое представление объекта в виде строки.

В отличие от обычных функций для определения методов не указывается ключевое слово function.

Для обращения внутри методов к полям и другим методам класса применяется ключевое слово this, которое указывает на текущий объект этого класса.

Применение методов:

class User {
 
    name: string;
    age: number;
	print(){
        console.log(`name: ${this.name}  age: ${this.age}`);
    }
	toString(): string{
		return `${this.name}: ${this.age}`;
	}
}

let tom = new User();
tom.name = "Tom";
tom.age = 36;
tom.print();					// name: Tom  age: 36

console.log(tom.toString());	// Tom: 36

Конструкторы

Кроме обычных методов классы имеют специальные функции - конструкторы, которые определяются с помощью ключевого слова constructor. Конструкторы выполняют начальную инициализацию объекта. Например, добавим в класс User конструктор:

class User {
 
    name: string;
    age: number;
	constructor(userName: string, userAge: number) {

        this.name = userName;
		this.age = userAge;
    }
	print(){
        console.log(`name: ${this.name}  age: ${this.age}`);
    }
}

let tom = new User("Tom", 36);
tom.print();		// name: Tom  age: 36

Здесь конструктор применимает два параметра и использует их значения для установки значения полей name и age:

constructor(userName: string, userAge: number) {
	this.name = userName;
	this.age = userAge;
}

Затем при создании объекта в конструктор передается два значения для его параметров:

let tom = new User("Tom", 36);

Поля для чтения

Полям класса в процессе работы программы можно присваивать различные значения, которые соответствуют типу полей. Однако TypeScript также позволяет определять поля для чтения, значения которых нельзя изменить (кроме как в конструкторе). Для определения таких полей применяется ключевое слово readonly:

class User {
 
    readonly name: string = "Default user";
    age: number;
	constructor(userName: string, userAge: number) {

        this.name = userName;
		this.age = userAge;
    }
	print(){
        console.log(`name: ${this.name}  age: ${this.age}`);
    }
}

Значение полей для чтения можно установить либо при объявлении:

readonly name: string = "Default user";

Либо в конструкторе:

constructor(userName: string, userAge: number) {

	this.name = userName;
	this.age = userAge;
}

В остальных местах программы значение этого поля нельзя изменить. Например, в следующем случае мы получим при компиляции ошибку, потому что пытаемся установить поле для чтения:

class User {
 
    readonly name: string = "Default user";
    age: number;
	constructor(userName: string, userAge: number) {

        this.name = userName;
		this.age = userAge;
    }
	print(){
        console.log(`name: ${this.name}  age: ${this.age}`);
    }
}

let tom = new User("Tom", 36);
tom.name = "Bob";		// ! Ошибка - поле name - только для чтения
tom.print();					// name: Tom  age: 36
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850