Таким образом, в приведенном ниже коде я должен иметь возможность сказать let obj = Factory.create ("class1", {})
const class1 = require("./class1")
const class2 = require("./class2")
class Factory{
static create(className,params){
return new className(params)
}
}
module.exports=Factory
3 ответа
Если вы готовы следовать определенному соглашению об именах, например, что class1 находится в class1.js, class2 находится в class2.js, вы можете попробовать следующее:
index.js
let classes = {};
class Factory {
static create(className, params) {
if (!classes[className]) {
classes[className] = require(`./${className}.js`);
}
console.log(`Creating ${className}...`);
return new classes[className](params)
}
}
let c1 = Factory.create('class1', {})
console.log(c1.sayHello());
let c2 = Factory.create('class2', {})
console.log(c2.sayHello());
< Сильный > class1.js
class class1 {
sayHello() {
return 'Hello from class1';
}
}
module.exports = class1;
< Сильный > class2.js
class class2 {
sayHello() {
return 'Hello from class2';
}
}
module.exports = class2;
Вы не . Классы определяются и на них ссылается указатель, как и все остальное. Вы ДОЛЖНЫ иметь способ ссылаться на этот указатель, будь то по ссылке или по ссылке на карте, используя строку. Это так же просто, как в JS. Либо у вас есть доступ, либо нет. Для доступа к ссылкам на основе строковых ключей у вас должно быть что-то, на что можно ссылаться указанным ключом Это верно и для большинства других языков. Здесь есть пара ответов об этом, но в противном случае, если он не найден на объекте, ключ ничего не сделает.
var test = { 'a': 1 };
'test'; // "test"
'test'.a; // undefined
Это именно то, как JS будет интерпретировать это. Чтобы ссылаться на test
по строке, вам понадобится что-то с тестом ключа, иначе у JS нет способа его интерпретировать.
Однако это не так уж плохо, так как это предотвратит отправку вам строки 'adminClass' и получение ему экземпляра указанного класса, разоблачающего всевозможные опасные вещи.
Так что для этой парадигмы вам понадобится карта классов, против которой вы будете идти. Object
должен работать просто отлично.
Попробуй это:
let classes = {
class1: require("./class1"),
class2: require("./class2")
}
class Factory{
static create(className,params){
return new classes[className](params)
}
}
module.exports=Factory
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
Для вопросов, касающихся программирования в ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (исключая ActionScript). Этот тег редко используется отдельно, но чаще всего ассоциируется с тегами [node.js], [jquery], [json] и [html].