Статические поля и методы

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

Кроме обычных полей и методов класс может иметь статические. Статические поля и методы относятся не к отдельным объектам, а в целом к классу. И для обащения к статическим полям и методам применяется имя класса.

Статические поля и методы определяются с помощью ключевого слова static:

class Person {
 
	age: number;
	name: string;
	
	static retirementAge: number = 65;
	static calculateYears(age: number): number{
		
		return Person.retirementAge - age;
	}
	
	constructor(name: string, age: number) {
		this.name = name;
		this.age = age;
	}
}

let tom = new Person("Tom", 36);
let years = Person.calculateYears(36);
console.log(Person.retirementAge);
console.log(`До пенсии осталось: ${years} лет`);

Здесь в классе Person определено статическое поле retirementAge, которое условно хранит возраст выхода на пенсию для объектов Person. Поскольку это свойство будет общим для всех объектов Person, то имеет смысл сделать его статическим, то есть общим для всего класса, как в данном случае.

Для обращения к этому полю применяется имя класса:

console.log(Person.retirementAge);

Также определен статический метод calculateYears(), который условно вычисляет оставшее до пенсии врем (для упрощения задачи условимся, что передаваемый возраст меньше возраста выхода на пенсию). И также для обращения к этому методу применяется имя класса, а не объекта:

let years = Person.calculateYears(36);

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

static calculateYears(): number{
		
	return Person.retirementAge - this.age;	// ! Ошибка - this.age - обращение к нестатическому полю
}

Как и обычные поля и методы статические могут иметь модификаторы доступа:

class Person {
 
	age: number;
	name: string;
	
	private static retirementAge: number = 65;
	static calculateYears(age: number): number{
		
		return Person.retirementAge - age;
	}
	
	constructor(name: string, age: number) {
		this.name = name;
		this.age = age;
	}
}

Также статические поля и методы могут наследоваться, что позволяет обращаться к ним через имя производного класса:

class Person {
 
	age: number;
	name: string;
	
	static retirementAge: number = 65;
	static calculateYears(age: number): number{
		
		return Person.retirementAge - age;
	}
	
	constructor(name: string, age: number) {
		this.name = name;
		this.age = age;
	}
}
class Employee extends Person {}

let years = Employee.calculateYears(36);
console.log(Employee.retirementAge);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850