JS оператор class


Загальний опис

class — це синтаксична конструкція JavaScript, яка дозволяє створювати шаблони для створення об'єктів. Хоча класи в JavaScript є "цукровою" надбудовою над прототипним наслідуванням, вони забезпечують зрозумілий і організований спосіб роботи з об'єктно-орієнтованим програмуванням.

Клас визначається за допомогою ключового слова class, після якого йде ім'я класу. Всі методи класу автоматично стають доступними для об'єктів, створених із цього класу. Основний метод класу — це constructor, який викликається під час створення нового екземпляра (об'єкта) і задає початкові значення властивостей:

class Car {
  constructor(brand, model) {
    this.brand = brand;
    this.model = model;
  }

  start() {
    console.log(`${this.brand} ${this.model} запускається!`);
  }
}

const myCar = new Car('Toyota', 'Corolla');
myCar.start(); // Toyota Corolla запускається!

Класи підтримують статичні методи (static), які доступні лише на самому класі, а не на його екземплярах:

class MathHelper {
  static add(a, b) {
    return a + b;
  }
}

console.log(MathHelper.add(2, 3)); // 5

Також класи можуть наслідувати один одного за допомогою ключового слова extends, що дозволяє створювати ієрархії об'єктів:

class ElectricCar extends Car {
  constructor(brand, model, battery) {
    super(brand, model);
    this.battery = battery;
  }

  charge() {
    console.log(`Заряджаємо батарею ${this.battery} кВтг`);
  }
}

const myElectricCar = new ElectricCar('Tesla', 'Model 3', 75);
myElectricCar.charge(); // Заряджаємо батарею 75 кВтг

Класи є основою для побудови масштабованих і організованих додатків.

автор: Bond

Порада

Якщо ваш клас має властивості, що часто не змінюються, використовуйте Object.freeze для об'єкта-параметра в constructor, щоб уникнути випадкових змін.

автор: Bond
Порада

Уникайте створення методів всередині конструктора — це призведе до зайвого споживання пам'яті, оскільки методи не будуть спільними між екземплярами. Використовуйте прототипи (методи класу) для збереження пам'яті.

автор: Bond
Порада

Не бійтеся розділяти класи на менші класи з єдиною відповідальністю. Клас з багатьма методами, які не пов'язані між собою, складно підтримувати.

автор: Bond

Синтаксис

class ClassName {
  constructor(parameter1, parameter2) {
    this.property1 = parameter1;
    this.property2 = parameter2;
  }

  method1() {
    // Метод класу
  }

  static staticMethod() {
    // Статичний метод
  }
}

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
49 45 10.1 36 13
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
49 49 45 10.3
Підтримка: серверні переглядачі
Переглядач Node.js Deno
6.0.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

Цей приклад демонструє використання класів для реалізації системи авторизації та приватних полів для безпечного зберігання паролів.

class User {
  constructor(username, password) {
    this.username = username;
    this.#password = password; // Приватне поле
  }

  #password; // Приватна змінна

  validatePassword(password) {
    return this.#password === password;
  }
}

class Admin extends User {
  constructor(username, password) {
    super(username, password);
  }

  deleteUser(user) {
    console.log(`Користувача ${user.username} видалено!`);
  }
}

const admin = new Admin('Admin', 'securepass');
const user = new User('User1', 'mypassword');

console.log(user.validatePassword('wrongpass')); // false
admin.deleteUser(user); // Користувача User1 видалено!
автор: Bond

Цей приклад показує, як за допомогою класу створювати динамічний список нотаток. Клас NotesApp містить методи для додавання, видалення та відображення нотаток. Користувач взаємодіє зі сторінкою через форму введення і кнопки "Видалити", що дає можливість повністю управляти списком нотаток.

HTML

<header>
  <h2 class="title">Клас "NotesApp"</h2>
  <p class="description">Реалізує систему управління нотатками з додаванням і видаленням записів.</p>
</header>
<main>
  <div class="result">
    <!-- Форма для додавання нотатки -->
    <form id="note-form">
      <label for="note-input">Введіть нотатку:</label>
      <input type="text" id="note-input" placeholder="Наприклад, купити молоко" required />
      <button type="submit">Додати нотатку</button>
    </form>
    <!-- Список нотаток -->
    <ul id="notes-list" style="margin-top: 15px;"></ul>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

.result {
  background-color: #f8f8f8;
  padding: 15px;
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

form {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

input {
  padding: 8px;
  border: 1px solid #ccc;
  border-radius: 4px;
}

button {
  padding: 10px;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

button:hover {
  background-color: #0056b3;
}

ul {
  list-style: none;
  padding: 0;
}

li {
  padding: 10px;
  margin: 5px 0;
  background-color: #f9f9f9;
  border: 1px solid #ccc;
  border-radius: 4px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

li button {
  padding: 5px 10px;
  background-color: #dc3545;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

li button:hover {
  background-color: #c82333;
}

JS

class NotesApp {
  constructor() {
    this.notes = []; // Масив нотаток
  }

  // Додає нову нотатку
  addNote(note) {
    this.notes.push(note);
    this.renderNotes();
  }

  // Видаляє нотатку за індексом
  deleteNote(index) {
    this.notes.splice(index, 1);
    this.renderNotes();
  }

  // Відображає нотатки на сторінці
  renderNotes() {
    const notesList = document.getElementById('notes-list');
    notesList.innerHTML = '';

    this.notes.forEach((note, index) => {
      const noteItem = document.createElement('li');
      noteItem.textContent = note;

      const deleteButton = document.createElement('button');
      deleteButton.textContent = 'Видалити';
      deleteButton.addEventListener('click', () => this.deleteNote(index));

      noteItem.appendChild(deleteButton);
      notesList.appendChild(noteItem);
    });
  }}


// Ініціалізація програми
const app = new NotesApp();
const form = document.getElementById('note-form');
const input = document.getElementById('note-input');

form.addEventListener('submit', function (event) {
  event.preventDefault(); // Забороняємо перезавантаження сторінки
  const note = input.value.trim();
  if (note) {
    app.addNote(note); // Додаємо нотатку
    input.value = ''; // Очищуємо поле вводу
  }
});
//# sourceURL=pen.js
автор: Bond

Клас реалізує кошик покупок з підтримкою знижок, демонструючи наслідування та перевизначення методів.

class Cart {
  constructor() {
    this.items = [];
  }

  addItem(item, price) {
    this.items.push({ item, price });
  }

  calculateTotal() {
    return this.items.reduce((total, currentItem) => total + currentItem.price, 0);
  }
}

class DiscountCart extends Cart {
  constructor(discountRate) {
    super();
    this.discountRate = discountRate;
  }

  calculateTotal() {
    const total = super.calculateTotal();
    return total - total * this.discountRate;
  }
}

const myCart = new DiscountCart(0.1);
myCart.addItem('Товар 1', 100);
myCart.addItem('Товар 2', 200);
console.log(myCart.calculateTotal()); // 270
автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід