我正在阅读配置文件,其中包含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'
}
}
答案 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])();
希望这会有所帮助:)