← Назад к вопросам

Зачем писать new вместо функции?

1.0 Junior🔥 191 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем писать new вместо функции?

Различие между функцией и конструктором

В JavaScript new используется для вызова конструктора - функции, которая создаёт новый объект с определённой структурой и поведением. Это не просто функция, а инструмент для создания экземпляров объектов.

Основные причины использовать new

1. Создание нового объекта с собственным контекстом

В обычной функции this указывает на глобальный объект (или undefined в strict mode). С new создаётся свежий объект, и this указывает именно на него:

function User(name) {
  this.name = name;
}

const user1 = new User("Алиса");
console.log(user1.name); // "Алиса"
console.log(user1 instanceof User); // true

Без new:

const user2 = User("Боб");
console.log(user2); // undefined - функция ничего не вернула

2. Установка прототипа

new автоматически связывает новый объект с prototype конструктора. Это обеспечивает прототипное наследование:

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  return `${this.name} издаёт звук`;
};

const dog = new Animal("Собака");
console.log(dog.speak()); // "Собака издаёт звук"

3. Вызов внутреннего метода [[Construct]]

Операция new вызывает специальный внутренний метод, который нельзя вызвать обычным образом. Для стрелочных функций и методов это вызывает ошибку:

const arrow = () => {};
new arrow(); // TypeError: arrow is not a constructor

Аналогия с классами

В современном JavaScript вместо функций-конструкторов используют классы, но под капотом они работают одинаково:

class User {
  constructor(name) {
    this.name = name;
  }
}

const user = new User("Виктор");
console.log(user instanceof User); // true

Когда new обязателен

  • Создание экземпляров: при работе с классами и конструкторами
  • Прототипное наследование: когда нужно связать объект с prototype цепочкой
  • Инициализация состояния: когда нужно установить свойства для каждого экземпляра

Практический пример

function Button(text, color) {
  this.text = text;
  this.color = color;
}

Button.prototype.render = function() {
  return `<button style="color: ${this.color}">${this.text}</button>`;
};

const btn1 = new Button("Клик", "blue");
const btn2 = new Button("Отправить", "green");

console.log(btn1.render()); // <button style="color: blue">Клик</button>

Заключение

new - это не просто синтаксический сахар, а критически важный механизм JavaScript для создания объектов с правильным контекстом this и цепочкой прототипов. Без new вы получите undefined вместо объекта и потеряете связь с prototype. Это основа объектно-ориентированного программирования в JavaScript.

Зачем писать new вместо функции? | PrepBro