【发布时间】:2017-06-15 06:46:47
【问题描述】:
var method = 'serviceName.MethodName'
我只想这样称呼它
serviceName.methodName(function(output callback){
});
有什么方法可以调用吗。谢谢
【问题讨论】:
var method = 'serviceName.MethodName'
我只想这样称呼它
serviceName.methodName(function(output callback){
});
有什么方法可以调用吗。谢谢
【问题讨论】:
我现在能想到的方法有两种。
JS 评估 您可以使用 javascript eval 函数将任何字符串转换为代码 sn-p,如下所示。虽然 eval 是一种快速的解决方案,但除非您身边没有任何其他选择,否则不应使用。
var 方法 = 'UserService.getData'; 评估(方法)();
工厂模式 使用以下模式获取服务
您需要以可以使用模式访问它们的方式定义服务。
var Services = {
// UserService and AccountsService are again objects having some callable functions.
UserService : {getData: function(){}, getAge: function(){}},
AccountsService : {getData: function(){}, getAge: function(){}},
// getService is the heart of the code which will get you the required service depending on the string paramter you pass.
getService : function(serviceName){
var service = '';
switch(serviceName){
case 'User':
service = this.UserService;
break;
case 'Accounts':
service = this.AccountsService;
break;
}
return service;
}
}
您可以使用以下代码获取所需的服务
Services.getService('User')
【讨论】:
我不知道有什么方法可以在不使用eval 的情况下将该字符串的serviceName 部分解析为对象。所以显然你需要非常小心。
也许:
if (method.match(/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/) {
var servicePart = eval(method.split('.')[0]);
var methodPart = method.split('.')[1];
servicePart[methodPart](...)
}
【讨论】:
您的问题有两个不同的问题:
关于第一个问题 - 使用以下符号很容易通过字符串访问对象属性:
const myObject = {
myProp: 1,
};
console.log(myObject['myProp']);
关于第二个问题 - 这取决于 serviceName 是什么:
someObject['serviceName']['MethodName']
【讨论】: