Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: constructor function, new operator, this binding, implicit return, prototype

Что произойдет, если функция-конструктор не возвращает явного значения?

Вопрос проверяет понимание поведения JavaScript при вызове функции с оператором new, когда функция-конструктор не возвращает объект явно.

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

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

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

В JavaScript функция становится конструктором при вызове с оператором new. Понимание того, что происходит, когда такая функция не возвращает значение явно, является ключевым для работы с объектно-ориентированными паттернами в языке.

Механизм оператора new

Когда функция вызывается с new, движок JavaScript выполняет следующие шаги:

  1. Создаётся новый пустой объект.
  2. Свойство prototype этой функции связывается с внутренним свойством [[Prototype]] (или __proto__) нового объекта.
  3. Вновь созданный объект привязывается к ключевому слову this внутри контекста выполнения функции.
  4. Выполняется тело функции (обычно оно модифицирует this, добавляя свойства).
  5. Если функция не возвращает свой собственный объект (т.е. возвращает undefined или примитивное значение), оператор new автоматически возвращает только что созданный объект, связанный с this. Если функция возвращает другой объект, возвращается именно он.

Примеры кода

Рассмотрим стандартный случай, когда функция не имеет оператора return:

function Person(name) {
  this.name = name;
  // Нет оператора return
}

const john = new Person('John');
console.log(john.name); // 'John'
console.log(john instanceof Person); // true

Здесь new Person создаёт объект, присваивает его this, выполняет this.name = name, а затем, поскольку возвращаемого значения нет (фактически возвращается undefined), оператор new возвращает автоматически созданный объект.

Теперь рассмотрим случай, когда функция возвращает примитив:

function Car(model) {
  this.model = model;
  return 42; // Возвращает примитив
}

const myCar = new Car('Tesla');
console.log(myCar.model); // 'Tesla'
console.log(myCar instanceof Car); // true

Несмотря на return 42, оператор new игнорирует примитивное значение и всё равно возвращает объект, созданный на шаге 1.

И, наконец, случай явного возврата объекта:

function Animal(type) {
  this.type = type;
  return { custom: 'object' }; // Явно возвращает другой объект
}

const dog = new Animal('Mammal');
console.log(dog.custom); // 'object'
console.log(dog.type); // undefined
console.log(dog instanceof Animal); // false

Здесь оператор new видит, что функция возвращает объект, и возвращает именно его, полностью игнорируя объект, созданный на шаге 1 и привязанный к this.

Где это применяется

Это поведение лежит в основе классического наследования через конструкторы и прототипы в ES5. Понимание этого механизма критично для:

  • Создания собственных библиотек или фреймворков.
  • Отладки неожиданного поведения, когда функция-конструктор случайно возвращает значение.
  • Реализации паттернов, таких как кэширование объектов или пулы, где конструктор может возвращать заранее созданный экземпляр.

Вывод: Стандартное и ожидаемое поведение конструктора — не возвращать значение явно, полагаясь на автоматическое создание объекта оператором new. Явный возврат объекта полезен в специфических случаях, например, для реализации синглтонов или мемоизации, но требует осторожности, так как ломает стандартную семантику instanceof.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#constructor function

#new operator

#this binding

#implicit return

#prototype

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