Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: object, return, constructor, pattern

Что произойдёт, если в функции-конструкторе вернуть объект? Какой объект будет результатом — возвращённый или this?

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

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

Если функция-конструктор возвращает объект, то возвращается именно этот объект, а не автоматически созданный через this. Возвращаемый объект полностью заменяет объект, на который ссылается this. Это позволяет создавать фабричные методы и контролировать процесс создания объектов.

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

Возврат объектов из функций-конструкторов

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

Подмена созданного объекта

Возвращаемый объект заменяет объект, созданный оператором new:

javascript

function Person(name) {
  this.name = name; // Это свойство будет потеряно
  
  // Возвращаемый объект заменяет созданный
  return { customName: 'Кастомное имя' };
}

const person = new Person('Иван');
console.log(person); // { customName: 'Кастомное имя' }
console.log(person.name); // undefined
console.log(person instanceof Person); // false

Сравнение с обычным поведением

Разница между возвратом объекта и примитива:

javascript

function NormalConstructor() {
  this.property = 'значение';
  // Не возвращаем ничего (или возвращаем примитив)
}

function ObjectReturningConstructor() {
  this.property = 'значение';
  return { customProperty: 'кастомное значение' };
}

const normal = new NormalConstructor();
const custom = new ObjectReturningConstructor();

console.log(normal.property); // "значение"
console.log(custom.property); // undefined
console.log(custom.customProperty); // "кастомное значение"

Практическое применение

Это поведение используется в различных паттернах:

1. Фабричный метод

javascript

function CreateUser(type) {
  if (type === 'admin') {
    return { role: 'admin', permissions: ['read', 'write', 'delete'] };
  } else {
    return { role: 'user', permissions: ['read'] };
  }
}

const admin = new CreateUser('admin');
const user = new CreateUser('user');

2. Кэширование экземпляров

javascript

function Logger(name) {
  // Если экземпляр уже существует, возвращаем его
  if (Logger.instances[name]) {
    return Logger.instances[name];
  }
  
  this.name = name;
  Logger.instances[name] = this;
}

Logger.instances = {};

const logger1 = new Logger('app');
const logger2 = new Logger('app');
console.log(logger1 === logger2); // true - тот же объект

3. Декораторы и обертки

javascript

function Observable(target) {
  const observers = [];
  
  return {
    subscribe: function(observer) {
      observers.push(observer);
    },
    notify: function(data) {
      observers.forEach(observer => observer(data));
    },
    // Сохраняем оригинальный target
    target: target
  };
}

const observable = new Observable({ data: 'test' });

Ограничения и предостережения

Возврат объектов из конструкторов может быть неочевидным:

javascript

function ConfusingConstructor() {
  this.expected = 'ожидаемое свойство';
  return { unexpected: 'неожиданное свойство' };
}

const obj = new ConfusingConstructor();
// Разработчик может ожидать obj.expected, но получит obj.unexpected

Современная альтернатива

Вместо возврата объектов из конструкторов лучше использовать фабричные функции:

javascript

// Более понятная альтернатива
function createUser(type) {
  if (type === 'admin') {
    return { role: 'admin', permissions: ['read', 'write', 'delete'] };
  } else {
    return { role: 'user', permissions: ['read'] };
  }
}

// Вызывается без new
const admin = createUser('admin');

Вывод: При возврате объекта из функции-конструктора возвращается именно этот объект, а не автоматически созданный. Это мощная возможность, но ее следует использовать осознанно, так как она нарушает стандартное ожидание поведения конструкторов.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • JavaScript

    JavaScript

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

#object

#return

#constructor

#pattern

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию