Динамическое создание экземпляра класса без предварительной загрузки класса

#javascript #node.js

#javascript #node.js

Вопрос:

Возможно ли создать динамический класс без его предварительной загрузки? Я бы хотел избежать предварительной загрузки класса, поскольку я его динамически импортирую. Ниже приведен пример кода, который иллюстрирует, чего я пытаюсь достичь:

   import(namespace).then((DynamicClass) => {
    var classInstance = new DynamicClass();
  }
 

В настоящее время это приводит к:
(узел: 962) Необработанное promiserejectionwarning: ошибка типа: dynamicClass не является конструктором

Когда я утешаю.зарегистрируйте DynamicClass, он показывает:

 { default: [Function: DynamicClass] }
 

Класс определяется следующим образом:

namespace/index.js

 class DynamicClass extends BaseClass {
   //...
}
module.exports = DynamicClass;
 

Комментарии:

1. Если это не конструктор, что это такое? Должен быть первый последующий вопрос, с которого начинается отладка.

2. @Taplar обновил вопрос с более подробной информацией, чтобы проиллюстрировать полный вариант использования.

3. Так dynamicClass.default может быть конструктор

4. @Taplar это сделало свое дело. Не могу поверить, что я это пропустил…

Ответ №1:

Похоже, ваша проблема связана с неправильным пониманием модулей и менее используемым синтаксисом динамического импорта. Вы не импортируете класс, вы импортируете модуль ES. Вы можете использовать импортированный модуль для доступа к экспортируемым значениям модуля с помощью соответствующего вызова в зависимости от того, является ли желаемое значение экспортом по умолчанию или нет.

Если ваш модуль экспортирует класс по умолчанию, например

 export default class Class(){...}
 

Вы должны использовать функцию default(), доступную в модуле, чтобы получить определение класса для инициализации.

 const module = await import("module-name")
const obj = new module.default();