Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: binding, this, constructor

Чему будет равен this при вызове функции-конструктора?

Этот вопрос углубляет понимание значения this в различных сценариях вызова функций-конструкторов.

Короткий ответ

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

Длинный ответ

Значение this при вызове функции-конструктора

Значение this зависит исключительно от того, как вызывается функция-конструктор.

Вызов с оператором new

При корректном использовании с new:

javascript

function Person(name) {
  // this ссылается на новый объект
  this.name = name;
  console.log(this); // Person { name: ... }
}

const person = new Person('Иван');

Вызов без оператора new

При обычном вызове функции:

javascript

function Person(name) {
  this.name = name;
  console.log(this); // Зависит от контекста
}

// В нестрогом режиме
Person('Иван'); // this = global/window объект

// В строгом режиме
'use strict';
Person('Иван'); // this = undefined (будет ошибка)

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

Рассмотрим различные сценарии:

javascript

// Пример 1: Обычный вызов с new
function Car(brand) {
  this.brand = brand;
  console.log(this instanceof Car); // true
}
const car = new Car('Toyota');

// Пример 2: Вызов без new (ошибка)
function Bike(model) {
  this.model = model;
}
// Bike('Yamaha'); // Ошибка в строгом режиме

// Пример 3: Вызов метода как конструктора
const obj = {
  createCar: function(brand) {
    this.brand = brand;
  }
};

obj.createCar('BMW'); // this = obj
new obj.createCar('Audi'); // this = новый объект

Защита от неправильного вызова

Можно добавить проверку для безопасного использования:

javascript

function SafeConstructor(value) {
  // Проверяем, вызвана ли функция с new
  if (!(this instanceof SafeConstructor)) {
    // Если нет, вызываем себя правильно
    return new SafeConstructor(value);
  }
  
  this.value = value;
}

// Оба вызова работают одинаково
const obj1 = new SafeConstructor('test');
const obj2 = SafeConstructor('test'); // Автоматически исправляется

Современный подход с классами

В классах ES6 вызов без new всегда приводит к ошибке:

javascript

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

const person = new Person('Иван'); // OK
// Person('Иван'); // Ошибка: Class constructor cannot be invoked without 'new'

Вывод: this в функции-конструкторе равен новому объекту только при вызове с new. Всегда используйте new с конструкторами или применяйте защитные проверки для избежания ошибок.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#binding

#this

#constructor

Подпишись на React Developer в телеграм