Конструктор и ключевое слово new
Что такое конструктор?
Конструктор — это обычная функция в JavaScript, которая предназначена для создания однотипных
объектов (экземпляров).
Представьте, что вам нужно создать несколько собак с одинаковыми характеристиками. Вместо того чтобы
каждый раз писать один и тот же код, можно создать «шаблон» — конструктор.
Основное назначение:
- Создание множества похожих объектов
- Избежание дублирования кода
- Создание сложных объектов с методами и свойствами
Именование конструкторов
Конструкторы принято называть с большой буквы и использовать существительные:
// Правильно — с большой буквы, существительное
function Dog(name, age) {
this.name = name
this.age = age
}
// Неправильно — с маленькой буквы, глагол
function createDog(name, age) {
// ...
}
Оператор new
Конструкторы всегда вызываются с оператором new:
// Создаем двух собак
const myDog = new Dog("Шарик", 3)
const yourDog = new Dog("Бобик", 5)
Что делает оператор new
- Создает новый пустой объект.
- Устанавливает
this на этот новый объект.
- Выполняет код функции‑конструктора.
- Автоматически возвращает созданный объект.
function Dog(name, age) {
// this = {} (неявно создается оператором new)
this.name = name // добавляем свойство
this.age = age // добавляем свойство
// return this; (неявно возвращается оператором new)
}
Контекст this в конструкторах
При вызове с new:
function Dog(name) {
this.name = name // this ссылается на новый объект
this.voice = function () {
return "Гав! Меня зовут " + this.name
}
}
const myDog = new Dog("Шарик")
console.log(myDog.voice()) // "Гав! Меня зовут Шарик"
console.log(myDog) // {name: 'Шарик', voice: ƒ}
При вызове без new (НЕ ДЕЛАЙТЕ ТАК!):
const badDog = Dog("Шарик") // забыли new
console.log(badDog) // undefined — функция ничего не возвращает
console.log(window.name) // "Шарик" — свойство добавилось в window!
Добавление методов
Методы можно добавлять прямо в конструкторе:
function User(name, email) {
this.name = name
this.email = email
this.getInfo = function () {
return `Пользователь: ${this.name}, Email: ${this.email}`
}
}
const user1 = new User("Иван", "ivan@mail.ru")
console.log(user1.getInfo()) // "Пользователь: Иван, Email: ivan@mail.ru"
Примечание: в реальных проектах методы лучше выносить в prototype, чтобы не дублировать функции
на каждый экземпляр.
Сравнение с литералами объектов
Литералы объектов (просто и быстро):
// Для одноразовых объектов
const singleDog = {
name: "Шарик",
age: 3,
voice: function () {
return "Гав!"
},
}
Конструкторы (для множества однотипных объектов):
// Когда нужно много одинаковых объектов
function Dog(name, age) {
this.name = name
this.age = age
this.voice = function () {
return "Гав! Меня зовут " + this.name
}
}
// Создаем сколько угодно собак
const dog1 = new Dog("Шарик", 3)
const dog2 = new Dog("Бобик", 5)
const dog3 = new Dog("Рекс", 2)
Практический пример
// Конструктор для создания книг
function Book(title, author, year) {
this.title = title
this.author = author
this.year = year
this.getInfo = function () {
return `${this.title} (${this.author}, ${this.year})`
}
this.getAge = function () {
const currentYear = new Date().getFullYear()
return currentYear - this.year
}
}
// Создаем несколько книг
const book1 = new Book("Война и мир", "Л. Толстой", 1869)
const book2 = new Book("Преступление и наказание", "Ф. Достоевский", 1866)
console.log(book1.getInfo()) // "Война и мир (Л. Толстой, 1869)"
console.log(book2.getAge()) // Возраст книги в годах
Современный синтаксис (классы)
В новых версиях JavaScript используется синтаксис классов:
class Book {
constructor(title, author, year) {
this.title = title
this.author = author
this.year = year
}
getInfo() {
return `${this.title} (${this.author}, ${this.year})`
}
}
// Использование такое же
const book = new Book("Название", "Автор", 2023)
Итог
- Используйте конструкторы, когда нужно создать много однотипных объектов.
- Всегда вызывайте конструкторы с
new.
- Называйте конструкторы с большой буквы и используйте существительные.
- Используйте литералы объектов
{} для простых одноразовых объектов.
❗
Для сложных объектов со свойствами и методами, а также при необходимости многократного создания
однотипных экземпляров, обязательно следует использовать конструкторы.