Уровень класса против уровня экземпляра
Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy — урок 31 из 56.
В классах JavaScript существует два различных уровня свойств и методов:
- Уровень экземпляра: свойства и методы, которые принадлежат каждому отдельному объекту, созданному на основе класса.
- Уровень класса: свойства и методы, которые принадлежат самому классу, а не его экземплярам.
Давайте разберем разницу:
Сначала давайте рассмотрим члены уровня экземпляра. Создайте обычный класс с методом экземпляра:
class Car {
constructor(make) {
this.make = make;
}
drive() {
return `The ${this.make} is driving`;
}
}Создайте экземпляр класса Car:
const myCar = new Car("Toyota");Вызовите метод экземпляра:
console.log(myCar.drive()); // Выводит: "The Toyota is driving"Обратите внимание, что каждый экземпляр получает свою собственную копию метода drive и может обращаться к своим собственным свойствам с помощью this.
Теперь давайте рассмотрим члены уровня класса. Мы добавим статический метод в наш класс. Используйте ключевое слово static перед именем метода, чтобы создать метод, который принадлежит самому классу, а не его экземплярам.
class Car {
constructor(make) {
this.make = make;
}
drive() {
return `The ${this.make} is driving`;
}
static compareModels(car1, car2) {
return `Comparing ${car1.make} with ${car2.make}`;
}
}Статические методы полезны для вспомогательных функций, которые не зависят от данных конкретного экземпляра. Статический метод вызывается у самого класса, а не у его экземпляров:
const car1 = new Car("Toyota");
const car2 = new Car("Honda");
console.log(Car.compareModels(car1, car2)); // Вывод: "Comparing Toyota with Honda"Попытка вызова статического метода на экземпляре приведет к ошибке:
car1.compareModels(car1, car2); // Ошибка: car1.compareModels не является функциейЗадание
Вам дан класс Calculator, содержащий только конструктор. Ваша задача — добавить два метода:
1. Метод экземпляра <strong>add(number)</strong>
- Добавляет заданное число к текущему значению калькулятора
Обновляет
this.valueи возвращает новое значение*Вызывается на экземплярах калькулятора:
calc.add(3)
2. Статический метод <strong>multiply(num1, num2)</strong>
- Принимает два числа и возвращает их произведение
НЕ использует
this(статические методы не имеют доступа к данным экземпляра)*Вызывается непосредственно у класса Calculator:
Calculator.multiply(4, 6)
Шпаргалка
Классы JavaScript имеют два уровня свойств и методов:
- Уровень экземпляра: Принадлежат каждому отдельному объекту, созданному на основе класса
- Уровень класса: Принадлежат самому классу, а не его экземплярам
Методы экземпляра:
Обычные методы, которые могут обращаться к свойствам экземпляра с помощью this:
class Car {
constructor(make) {
this.make = make;
}
drive() {
return `The ${this.make} is driving`;
}
}
const myCar = new Car("Toyota");
console.log(myCar.drive()); // "The Toyota is driving"Статические методы:
Используйте ключевое слово static для создания методов, которые принадлежат самому классу. Они вызываются у класса, а не у экземпляров:
class Car {
static compareModels(car1, car2) {
return `Comparing ${car1.make} with ${car2.make}`;
}
}
const car1 = new Car("Toyota");
const car2 = new Car("Honda");
// Вызов у самого класса
console.log(Car.compareModels(car1, car2)); // "Comparing Toyota with Honda"
// Вызов у экземпляра приводит к ошибке
car1.compareModels(car1, car2); // Error: car1.compareModels is not a functionСтатические методы полезны для вспомогательных функций, которые не зависят от данных конкретного экземпляра.
Попробуйте сами
import { Calculator } from './calculator.js';
// Не изменяйте код ниже
const calc = new Calculator(5); // Создает калькулятор со значением = 5
const result1 = calc.add(3); // Должно прибавить 3 → 5 + 3 = 8
const result2 = Calculator.multiply(4, 6); // Должно умножить 4 × 6 = 24
console.log(result1); // Ожидается: 8
console.log(result2); // Ожидается: 24В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса Circle14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композиции6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средств9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закрепление