получить экземпляр класса из require () - PullRequest
0 голосов
/ 13 января 2019

Скажите, у меня есть нормальный модуль

  module.exports = class MyClass{ }

Стандартный способ использовать его так:

const MyClass = require('myclass.js');

Но что, если я не знаю имя класса и имя файла является переменной? Как мне получить класс от него?

const ???? = require(file + '.js');

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Рассматриваемые классы являются функциями "под капотом", и вы можете получить доступ к имени функции, вы можете получить доступ к имени во время выполнения. Однако для создания экземпляров вам не нужно знать имя класса в требуемом файле, так как вы в любом случае даете ему новый псевдоним в требуемом файле. Таким образом, единственное, что вам действительно нужно знать, - это имя файла, который требуется.

// my-class.js
module.exports = class MyClass { }

// require-class.js
const MyNewClassName = require("./my-class");
console.log(MyNewClassName.name); // => "MyClass"
const classInstance = new MyNewClassName();
console.log(classInstance); // => MyClass { }

Если вы хотите убедиться, что вы сохранили имя класса и выставили его, я рекомендую экспортировать объект как пространство имен. Если вы хотите сделать его универсальным, вы можете получить имя (имена) экспортированных ключей объекта через Object таких помощников, как

// my-class.js
class MyClass {}
module.exports = {MyClass: MyClass};
// or module.exports = {MyClass};

// requiring file ...
const importedObject = require("./my-class");
const myInstance = new importedObject.MyClass();
const objectsInRequire = Object.keys(importedObject); // => ["MyClass"]
0 голосов
/ 13 января 2019

Переменная может быть названа произвольно, имя класса не имеет значения, потому что импортируется весь модуль, а экспорт модуля является самим классом. Было бы важно, если бы он был назван экспорт как exports.MyClass = class MyClass {...}.

.js расширение также необязательно, в то время как относительный путь имеет значение.

Это:

const MyClassNameDoesntMatterHere = require('./' + className);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...