Создайте объект через Object.create(Constructor.prototype), вызовите обычную функцию-конструктор с этим this и учтите явно возвращённый объект. Для class и встроенных конструкторов нужен Reflect.construct.
Создание собственного аналога оператора new
Создайте объект через Object.create(Constructor.prototype), вызовите обычную функцию-конструктор с этим this и учтите явно возвращённый объект. Для class и встроенных конструкторов нужен Reflect.construct.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите функцию createInstance, которая получает в качестве первого параметра конструктор (например, Book) и произвольное количество остальных аргументов. Функция должна:
- Сформировать новый объект, чей прототип берётся из свойства
prototypeпереданного конструктора. - Вызвать конструктор с привязанным контекстом
thisк только что созданному объекту, передав ему все полученные аргументы. - Вернуть полученный объект, который должен быть экземпляром переданного конструктора.
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).