从字符串调用工厂/函数

时间:2016-12-21 21:35:55

标签: javascript angularjs

我正在阅读配置文件,其中包含Angular Factories / Function名称的映射。工厂/函数名称在映射中存储为字符串。我想知道如何能够执行我从配置中读取的工厂/功能?

window无法访问这些工厂,否则我可以致电window[factory][functionName]()

我是否必须诉诸:

var factory;
var factoryName = getFactory(config.sendTelemetry);

if (factoryName === 'TelemetryFactory') {
    factory = TelemetryFactory;
} else if (factoryName === 'DebugFactory') {
    factory = DebugFactory;
}

factory[functionName]();

示例配置文件:

// Sample config file
var config = {
    'sendTelemetry': {
        'factory': 'TelemetryFactory',
        'functionName': 'sendTelemetry'
    },
    'logDebug': {
        'factory': 'DebugFactory',
        'functionName': 'logDebug'
    }
}

2 个答案:

答案 0 :(得分:1)

如果函数只是通常作用域的函数,则可以从名称到函数引用一次性创建查找映射,以避免使用长switch语句:

var funcMap = {
    TelemetryFactory: TelemetryFactory,
    DebugFactory: DebugFactory
};

或者通过使用每个函数的.name属性并从函数引用数组构造映射来避免(可能容易出错)重复:

// build lookup map
var funcs = [ TelemetryFactory, DebugFactory ];
var funcMap = {};
funcs.forEach(function(f) {
    funcMap[f.name] = f;
});

在ES6中它变得更加简单,因为ES6有一个对象文字语法,您可以在其中传递变量(或函数)的名称,它会自动创建一个具有该变量名称和值的键:

let funcMap = { TelemetryFactory, DebugFactory };

无论您使用上述三种方法构建地图中的哪一种,通过地图调度都是一项微不足道的操作:

funcMap[factoryName]();

答案 1 :(得分:-1)

看起来您需要先评估字符串:

eval(factory[functionName])();

希望这会有所帮助:)