与回调函数调用定义为字符串
问题描述:
var method = 'serviceName.MethodName'
我只是想这样称呼它与回调函数调用定义为字符串
serviceName.methodName(function(output callback){
});
有什么方法调用it.thanks
答
我不知道的任何方式,您可以将该字符串的serviceName
部分解析为对象,而不使用eval
。所以显然你需要非常小心。
也许:
if (method.match(/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/) {
var servicePart = eval(method.split('.')[0]);
var methodPart = method.split('.')[1];
servicePart[methodPart](...)
}
答
有,我现在能想到的两种方法。
-
JS的eval 您可以使用JavaScript eval函数任意字符串转换成代码片段像下面。虽然eval是一个快速解决方案,但不应该使用,除非你没有任何其他选择。
var method ='UserService.getData'; eval(method)();
工厂模式 使用以下方式获得服务
你会需要这样你可以使用一个模式访问它们的方式来定义服务。
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;
}
}
可以使用get与下面的代码所需的服务
Services.getService('User')
答
有你的问题两个不同的问题:
- 如何通过属性名来访问对象属性(字符串) ?
- 如何通过它的名称(字符串)访问对象?
关于第一个问题 - 它很容易通过字符串中使用下面的符号来访问对象的属性:
const myObject = {
myProp: 1,
};
console.log(myObject['myProp']);
和关于第二个问题 - 这取决于什么serviceName
是:
- 如果它是某个其他对象的属性,则使用
someObject['serviceName']['MethodName']
- 如果它是局部变量,请考虑使用Map(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)将字符串与对象相关联;
谢谢Steve。这个对我有用 – shiva