Классы в JavaScript
Эта статья объясняет классы в JavaScript.
YouTube Video
Классы в JavaScript
В JavaScript класс воплощает концепцию объектно-ориентированного программирования и служит шаблоном для объектов. С помощью классов можно лаконично определить свойства и методы объекта, улучшая повторное использование и организацию кода. Синтаксис классов был введен в JavaScript в ES6.
Определение класса
Класс определяется с помощью ключевого слова class
и обычно инициализируется методом, называемым конструктором.
1class Person {
2 // Constructor method (called when the class is instantiated)
3 constructor(name, age) {
4 this.name = name; // Property definition
5 this.age = age;
6 }
7
8 // Method definition
9 greet() {
10 return `Hello, my name is ${this.name}`;
11 }
12}
13
14// Instantiation of the class
15const alice = new Person("Alice", 25);
16console.log(alice.greet()); // Hello, my name is Alice
- Мы определяем класс с помощью
class Person
. constructor
— это специальный метод, который автоматически вызывается при создании объекта.- Ключевое слово
this
относится к экземпляру (объекту) класса внутри класса.
Свойства и методы класса
Класс может определять свойства и методы. Свойства представляют атрибуты объекта, а методы представляют его функции.
1class Car {
2 constructor(brand, model) {
3 this.brand = brand;
4 this.model = model;
5 }
6
7 // Method definition
8 drive() {
9 console.log(`Driving a ${this.brand} ${this.model}`);
10 }
11}
12
13const car1 = new Car("Toyota", "Corolla");
14car1.drive(); // Driving a Toyota Corolla
В этом примере определяется класс Car
со свойствами brand
и model
и методом drive
.
Наследование классов
Классы могут наследовать другие классы. Используя наследование, можно создать новый класс на основе существующего и добавить ему новую функциональность.
1class Animal {
2 constructor(name) {
3 this.name = name;
4 }
5
6 speak() {
7 console.log(`${this.name} makes a noise`);
8 }
9}
10
11// Inherit from the Animal class
12class Dog extends Animal {
13 constructor(name, breed) {
14 super(name); // Call the constructor of the parent class (Animal)
15 this.breed = breed;
16 }
17
18 // Override the method
19 speak() {
20 console.log(`${this.name} barks`);
21 }
22}
23
24const dog = new Dog("Rex", "German Shepherd");
25dog.speak(); // Rex barks
В этом примере класс Dog
наследует класс Animal
.
- Ключевое слово
extends
используется для наследования от классаAnimal
. - В конструкторе класса
Dog
используетсяsuper()
для вызова конструктора родительского класса. Это позволяет наследовать процесс инициализации родительского класса. - В унаследованном классе можно переопределить методы родительского класса. В этом примере вместо "Рекс издает шум" отображается "Рекс лает".
Статические методы
Когда вы определяете статический метод в классе, метод ассоциируется с самим классом. Статические методы можно вызывать без создания экземпляра класса.
1class MathUtils {
2 // Static method
3 static add(a, b) {
4 return a + b;
5 }
6}
7
8console.log(MathUtils.add(5, 10)); // 15
В этом примере в классе MathUtils
определён статический метод add
.
- Ключевое слово
static
используется для определения статического метода. - Статические методы не принадлежат экземплярам класса и могут вызываться напрямую через сам класс.
Getter-ы и Setter-ы
Определяя getter-ы и setter-ы в классе, вы можете инкапсулировать получение и установку значений свойств.
1class Rectangle {
2 constructor(width, height) {
3 this.width = width;
4 this.height = height;
5 }
6
7 // Getter
8 get area() {
9 return this.width * this.height;
10 }
11
12 // Setter
13 set widthValue(newWidth) {
14 this.width = newWidth;
15 }
16}
17
18const rect = new Rectangle(10, 20);
19console.log(rect.area); // 200
20
21rect.widthValue = 15;
22console.log(rect.area); // 300
В этом примере в классе Rectangle
определены getter area
и setter widthValue
.
- Getter (
get
) вызывается при получении значения свойства. - Setter (
set
) вызывается при установке значения свойства.
Синтаксический сахар классов
В JavaScript синтаксис классов на самом деле реализуется с помощью конструкторов функций и прототипов. Синтаксис классов — это синтаксический сахар, позволяющий писать такие конструкции более лаконично.
1// Example without using class syntax
2function Person(name, age) {
3 this.name = name;
4 this.age = age;
5}
6
7Person.prototype.greet = function() {
8 return `Hello, my name is ${this.name}`;
9};
10
11const person = new Person("Alice", 25);
12console.log(person.greet()); // Hello, my name is Alice
В этом примере определяется функция-конструктор Person
, а метод greet
определяется с использованием прототипа.
Работа с this
Ключевое слово this
внутри класса ссылается на экземпляр этого класса. Тем не менее, при работе с this
в методах класса важно учитывать, что его поведение может меняться в зависимости от контекста. Проблемы могут возникнуть, особенно при использовании методов в качестве функций обратного вызова.
1class Counter {
2 constructor() {
3 this.count = 0;
4 }
5
6 increment() {
7 this.count++;
8 console.log(this.count);
9 }
10}
11
12const counter = new Counter();
13setTimeout(counter.increment, 1000); // NaN
14// NaN, since this.count is undefined, it becomes NaN after incrementing.
В таких случаях, когда метод передается в setTimeout
как callback-функция, ссылка на this
может измениться. Чтобы избежать этой проблемы, рекомендуется либо привязать this
с помощью метода bind
, либо использовать стрелочные функции.
1class Counter {
2 constructor() {
3 this.count = 0;
4 }
5
6 increment() {
7 this.count++;
8 console.log(this.count);
9 }
10}
11
12const counter = new Counter();
13
14// When using bind
15setTimeout(counter.increment.bind(counter), 1000);
16
17// When using an arrow function
18setTimeout(() => counter.increment(), 2000);
Резюме
- Классы используются как шаблоны для создания объектов, а также для определения свойств и методов.
- Вы можете использовать наследование для расширения класса, применяя концепции объектно-ориентированного программирования.
- Статические методы принадлежат самому классу и могут использоваться без создания его экземпляра.
- Вы можете инкапсулировать свойства, используя getter-ы и setter-ы.
- Синтаксис классов в JavaScript — это синтаксический сахар, который внутренне использует прототипное наследование.
Используя классы, вы можете более естественно работать с объектно-ориентированным программированием, а также повысить повторное использование кода и его сопровождение.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.