Таким образом, в приведенном ниже коде я должен иметь возможность сказать 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
0
Shubham Jindal 21 Авг 2018 в 13:21

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;
0
Terry Lennox 21 Авг 2018 в 13:04

Вы не . Классы определяются и на них ссылается указатель, как и все остальное. Вы ДОЛЖНЫ иметь способ ссылаться на этот указатель, будь то по ссылке или по ссылке на карте, используя строку. Это так же просто, как в JS. Либо у вас есть доступ, либо нет. Для доступа к ссылкам на основе строковых ключей у вас должно быть что-то, на что можно ссылаться указанным ключом Это верно и для большинства других языков. Здесь есть пара ответов об этом, но в противном случае, если он не найден на объекте, ключ ничего не сделает.

var test = { 'a': 1 };

'test'; // "test"
'test'.a; // undefined

Это именно то, как JS будет интерпретировать это. Чтобы ссылаться на test по строке, вам понадобится что-то с тестом ключа, иначе у JS нет способа его интерпретировать.

Однако это не так уж плохо, так как это предотвратит отправку вам строки 'adminClass' и получение ему экземпляра указанного класса, разоблачающего всевозможные опасные вещи.

Так что для этой парадигмы вам понадобится карта классов, против которой вы будете идти. Object должен работать просто отлично.

0
Robert Mennell 21 Авг 2018 в 13:26

Попробуй это:

let classes = {
    class1: require("./class1"),
    class2: require("./class2")
}
class Factory{
    static create(className,params){
       return new classes[className](params)
    }
}
module.exports=Factory
0
morteza ataiy 21 Авг 2018 в 11:38
51946551