Создание собственного аналога оператора new

Создайте объект через Object.create(Constructor.prototype), вызовите обычную функцию-конструктор с этим this и учтите явно возвращённый объект. Для class и встроенных конструкторов нужен Reflect.construct.

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

Что ответить на собеседовании

Создайте объект через Object.create(Constructor.prototype), вызовите обычную функцию-конструктор с этим this и учтите явно возвращённый объект. Для class и встроенных конструкторов нужен Reflect.construct.

Подробный разбор

Ответ с пояснениями

Условие

Напишите функцию createInstance, которая получает в качестве первого параметра конструктор (например, Book) и произвольное количество остальных аргументов. Функция должна:

  1. Сформировать новый объект, чей прототип берётся из свойства prototype переданного конструктора.
  2. Вызвать конструктор с привязанным контекстом this к только что созданному объекту, передав ему все полученные аргументы.
  3. Вернуть полученный объект, который должен быть экземпляром переданного конструктора.
function Book(name, author) {
  this.name = name;
  this.author = author;
}

function createInstance(Constructor, ...args) {
  // Ваш код здесь
}

const myBook = createInstance(Book, 'Учебник JavaScript', 'Петр Сергеев');

console.log(myBook); // { name: 'Учебник JavaScript', author: 'Петр Сергеев' }
console.log(myBook instanceof Book); // true

Ответ

Создайте объект через Object.create(Constructor.prototype), вызовите обычную функцию-конструктор с этим this и учтите явно возвращённый объект. Для class и встроенных конструкторов нужен Reflect.construct.

function createInstance(Constructor, ...args) {
  const prototype = Constructor.prototype;
  const object = Object.create(prototype !== null &&
    (typeof prototype === 'object' || typeof prototype === 'function')
    ? prototype : Object.prototype);
  const returned = Constructor.apply(object, args);
  return returned !== null && (typeof returned === 'object' || typeof returned === 'function')
    ? returned : object;
}

Для Book результат соответствует условию и instanceof Book равен true. Если конструктор явно возвращает другой объект, настоящий new тоже использует его, поэтому instanceof уже не гарантируется. Учебная имитация не проверяет внутреннюю конструктивность функций и не поддерживает классы/new.target; универсальная практическая запись — Reflect.construct(Constructor, args).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее