我想从像“User.find”这样的字符串动态调用函数。如果函数存在,脚本将在对象User中调用函数find()。这是我试过的:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1);
var methodToCall = method[1];
nameObj.call(methodToCall, some_data_array);
但它总会回归:
nameObj.call(methodToCall, some_data_array);
TypeError: Object User has no method 'call'
有什么想法吗?我不能使用窗口,因为它是node.js问题,脚本不在浏览器中执行。
答案 0 :(得分:8)
您完全误解了call()
。
call()
可让您调用具有不同this
的方法。
您希望按名称获取财产:
object[methodName](arg1, arg, ...);
答案 1 :(得分:1)
你实际上可以做到这一点。首先需要获取scope
,其中定义了命名空间/函数/对象。
例如,在您的代码中,我会假设它为window
。
因此,对代码进行一些修改会产生预期的结果:
var User = {};
User.find = function(x){
alert(x);
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = global[method[0]];
var methodToCall = method[1];
nameObj[methodToCall](some_data_array.name);
标记global[]
的使用。这就是它开始的地方。
[已编辑] *使用global
代替window
的修改代码,用于nodejs
。
答案 2 :(得分:0)
您要做的是访问全局对象。
这应该有效:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() +method[0].substring(1);
var methodToCall = method[1];
"use strict";
var global = (1,eval)("this");
alert(global[nameObj][methodToCall](some_data_array));
答案 3 :(得分:0)
有两种方法可获得理想的结果。在这种情况下,仅使用一个匿名函数非常简单,如下所示,传入 objName.name 中包含的字符串参数:
var f = function(oName){
if (oName == 'John Doe') {
return 1;
}
};
var objName = {name: 'John Doe'};
console.log( f( objName.name ) );
如果OP偏爱使用对象的call方法,则以下代码也将足够:
var myObj = {
myFunc: function() {
if (this.name == 'John Doe') {
return 1;
}
}
}
var objName = {
name: 'John Doe'
};
console.log(myObj.myFunc.call(objName));
需要注意的几件事。 myObj调用其方法myFunc()并传入对象参数objName。该方法中的 this 的目的是读取属性 name ,该属性具有绑定到对象objName的能力。