不使用Java中的Switch(ES6)调用新构造函数类的更好方法

问题描述 投票:1回答:2

这是我的第一个问题开发者,所以,不要对我这么难。

我正在使用javascript(ES6),类,构造函数等构建的项目中工作>

我有一个类,它取决于字符串的类型,进入swithc语句,并调用相关的新“ class_name”(构造函数)。

但是,我想知道是否有更好的方法来解决这个问题。

如果有一种方法可以在特定的文件夹中独立于存在的所有类独立地调用构建器,那将是理想的。

项目示例:

  • Types / _String.js
  • Types / _Date.js
  • Types / _Integer.js
  • .....
  • TypeSwitcher.js
  • (包含调用“ Types”类的构造函数的开关。)>

    与“ TypeSwitcher.js”的关联代码:

    "use strict"
    import _String from "./Inputs/_String";
    import _Integer from "./Inputs/_Integer";
    import _Date from "./Inputs/_Date";
    
    export default class InputFactory
    {
        static getInput(key,typedObject,form,inputDef)
        {
               let type=typedObject.getField(key).getTypeName();
               switch (type) 
               {
                 case "String": {
                   return new _String(key,typedObject,form,inputDef); 
                 } break;
    
                 case "Integer": {
                   return new _Integer(key,typedObject,form,inputDef); 
                 } break;
    
                 case "Date": {
                   return new _Date(key,typedObject,form,inputDef);                
                 }break;              
    
                default: {throw "Input undefined:"+type}     
               }          
        }       
    }
    

    我试图做这样的事情:

    "use strict"
    import _String from "./Inputs/_String";
    import _Integer from "./Inputs/_Integer";
    import _Date from "./Inputs/_Date";
    
    const predefinedSystemVar = ["String", "Integer", "Date"];
    
    export default class InputFactory
    {
        static getInput (key, typedObject, form, inputDef)
        {
          let type = typedObject.getField(key).getTypeName();
          if (predefinedSystemVar.includes(type) )    
              type = `_${type}`;  
          return eval( `new types[type](key, typedObject, form, inputDef)` );          
        }
    }
    

    但是它不起作用...:(

    问题,如果将来我要创建一个新的类,则必须添加一个新的“ case”并导入以考虑新的构造函数。

    所以,我尝试过的解决方案,我不太喜欢,因为我必须将新变量添加到“ predefinedSystemVar” ...

    ES6或javascript中是否有某些东西可以更好,更优化的方式完成这项工作,而不是切换-> case?

    提前感谢!

    问候

    这是我的第一个问题开发人员,所以,不要对我这么难。我正在使用javascript(ES6),类,构造函数等构建的项目中工作。我有一个类,该类取决于字符串的类型,可以通过...

    javascript ecmascript-6 es6-class
    2个回答
    0
    投票

    一种方法是创建一个对象,该对象的键与大小写相同,而值是一个可以按需返回值的函数,如下所示:

    "use strict"
    import _String from "./Inputs/_String";
    import _Integer from "./Inputs/_Integer";
    import _Date from "./Inputs/_Date";
    
    export default class InputFactory {
        static getInput(key, typedObject, form, inputDef) {
            let type = typedObject.getField(key).getTypeName();
            const operations = {
                "String": new _String(key, typedObject, form, inputDef),
                "Integer": new _Integer(key, typedObject, form, inputDef),
                "Date": new _Date(key, typedObject, form, inputDef),
            }
    
            try {
                return operations[type];
            } catch() {
                throw "Input undefined:" + type
            }
        }
    }
    

    0
    投票

    是的,如果我正确理解了这一点,那应该是可能的。除非我犯了一些语法错误,否则下面的代码应该可以工作。它确实需要更新classes数组,但比更新switch case和其他解决方案要少。

    © www.soinside.com 2019 - 2024. All rights reserved.