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

Что делает оператор new?

2.0 Middle🔥 152 комментариев
#JavaScript Core

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Что делает оператор new в JavaScript?

Оператор new в JavaScript используется для создания нового экземпляра объекта на основе функции-конструктора или класса. Он выполняет несколько ключевых шагов, которые превращают обычную функцию в механизм создания объектов с собственным контекстом и прототипной связью. Это фундаментальная часть объектно-ориентированного программирования (ООП) в языке до появления классов (ES6) и остается актуальной сегодня.

Пошаговый алгоритм работы new

Когда вызывается new MyFunction(), JavaScript выполняет следующую последовательность действий:

  1. Создание нового пустого объекта:
    Сначала в памяти создаётся новый пустой объект, который будет выступать в качестве контекста для функции-конструктора.

    // Внутренний процесс (псевдокод)
    const newInstance = {};
    
  2. Установка прототипной связи:
    Объект связывается с прототипом (prototype) функции-конструктора. Это обеспечивает доступ к методам и свойствам, определённым в MyFunction.prototype.

    // Установка прототипа
    Object.setPrototypeOf(newInstance, MyFunction.prototype);
    // Или внутренне: newInstance.__proto__ = MyFunction.prototype;
    
  3. Привязка контекста и вызов конструктора:
    Функция-конструктор вызывается с this, установленным на только что созданный объект. Это позволяет конструктору инициализировать свойства нового экземпляра.

    // Вызов конструктора с привязкой контекста
    MyFunction.call(newInstance);
    
  4. Возврат созданного объекта:
    Если конструктор не возвращает явно другой объект, оператор new автоматически возвращает новый созданный объект. Если же конструктор возвращает примитивное значение (число, строку, undefined), оно игнорируется, и возвращается объект. Но если возвращается другой объект, то он будет результатом выражения new.

    function MyFunction() {
        this.value = 42;
        // Неявный возврат: return this;
    }
    const instance = new MyFunction();
    console.log(instance.value); // 42
    

Примеры использования

Базовый пример с функцией-конструктором:

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.greet = function() {
    return `Привет, меня зовут ${this.name}!`;
};

const john = new Person('Иван', 30);
console.log(john.greet()); // "Привет, меня зовут Иван!"
console.log(john instanceof Person); // true

Пример с ES6+ классами (синтаксический сахар над функциями-конструкторами):

class Animal {
    constructor(species) {
        this.species = species;
    }
    
    makeSound() {
        return 'Звук!';
    }
}

const dog = new Animal('Собака');
console.log(dog.makeSound()); // "Звук!"

Особенности и важные нюансы

  • Явный возврат объекта в конструкторе:
    Если конструктор возвращает объект, он подменяет стандартное поведение new. Это редко используется, но может быть полезно для паттернов типа пулов объектов или синглтонов.

    function Singleton() {
        if (Singleton.instance) {
            return Singleton.instance; // Возвращаем существующий экземпляр
        }
        this.data = 'секрет';
        Singleton.instance = this;
    }
    const a = new Singleton();
    const b = new Singleton();
    console.log(a === b); // true
    
  • Работа со стрелочными функциями:
    Стрелочные функции не могут быть конструкторами, так как у них нет собственного this и свойства prototype. Попытка вызвать new с ними приведёт к ошибке.

    const ArrowFunc = () => {};
    // new ArrowFunc(); // Ошибка: ArrowFunc is not a constructor
    
  • Безопасная проверка:
    В современных конструкторах часто используют проверку, была ли функция вызвана с new, чтобы предотвратить случайные ошибки (особенно в библиотеках).

    function SafeConstructor(value) {
        if (!(this instanceof SafeConstructor)) {
            throw new Error('Используйте new!');
        }
        this.value = value;
    }
    

Отличие от обычного вызова функции

Вызов функции без new приводит к тому, что this указывает на глобальный объект (в нестрогом режиме) или undefined (в строгом режиме), что может вызывать нежелательные побочные эффекты или ошибки. Оператор new гарантирует изоляцию контекста для нового объекта.

Плохая практика (без new):

function BadExample() {
    this.foo = 'bar';
}
const bad = BadExample(); // this ссылается на window/global, создаётся глобальная переменная
console.log(window.foo); // 'bar' (в браузере)

Заключение

Оператор new — это механизм создания объектов с настраиваемыми свойствами и прототипным наследованием. Он играет ключевую роль в ООП JavaScript, обеспечивая создание множества однотипных объектов через функции-конструкторы или классы. Понимание его внутренней работы помогает писать более эффективный, надёжный код и избегать распространённых ошибок, связанных с контекстом this. В современном JavaScript рекомендуется использовать классы (ES6+), которые инкапсулируют логику new в более читаемый синтаксис, но под капотом всё равно работают через функции-конструкторы и оператор new.

Что делает оператор new? | PrepBro