Назад к вопросам
Middle
121
questionbank

Как работает оператор new в JavaScript?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Оператор new используется для создания экземпляра объекта на основе функции-конструктора.

При вызове new ФункцияКонструктор() происходят следующие шаги:

  1. Создается новый пустой объект в памяти.
  2. Прототип этого нового объекта устанавливается равным свойству prototype ФункцииКонструктора.
  3. Конструктор ФункцияКонструктор вызывается с контекстом выполнения (this), установленным на новый объект. Аргументы, переданные new, передаются в конструктор.
  4. Если конструктор возвращает не-примитивное значение (объект, массив, функция и т.д.), то это значение становится результатом вызова new.
  5. Если конструктор явно не возвращает значение или возвращает примитивное значение (число, строка, null, undefined, boolean, symbol, bigint), то результатом вызова new становится новый объект, созданный на шаге 1.

Пример:

function Person(name, age) {
  // this указывает на новый объект, созданный new
  this.name = name;
  this.age = age;
}

Person.prototype.greet = function() {
  // this все еще указывает на экземпляр объекта
  console.log(`Привет, меня зовут ${this.name} и мне ${this.age} лет.`);
};

const person1 = new Person('Алексей', 30); // Вызов new

console.log(person1); // { name: 'Алексей', age: 30 }
person1.greet(); // Привет, меня зовут Алексей и мне 30 лет.

console.log(person1 instanceof Person); // true

Аналогичное поведение можно эмулировать без new с помощью Object.create и call или apply:

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

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

// Эмуляция new
function customNew(constructor, ...args) {
  const obj = Object.create(constructor.prototype); // Шаг 1 и 2
  const result = constructor.apply(obj, args); // Шаг 3
  // Шаг 4 и 5
  return result !== null && typeof result === 'object' ? result : obj;
}

const person2 = customNew(Person, 'Мария', 25);

console.log(person2); // { name: 'Мария', age: 25 }
person2.greet(); // Привет, меня зовут Мария и мне 25 лет.