Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про 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');

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • JavaScript

    JavaScript

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

#object

#return

#constructor

#pattern

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