JavaScript动态调用对象方法的字符串

121

我能否通过字符串调用一个对象方法?我想像是这样的:

var FooClass = function() {
    this.smile = function() {};
}

var method = "smile";
var foo = new FooClass();

// I want to run smile on the foo instance.
foo.{mysterious code}(); // being executed as foo.smile();
5个回答

258
如果属性名称存储在变量中,使用[]
foo[method]();

3
在函数内使用变量对我来说不起作用:const genericResolver = (table, action, values) => { return Auth.isAuthenticated() .then(() => { return eval(table).findAll() - stackdave
如果你想在一个类的另一个方法中执行一个方法,可以使用this'methodName' - schlingel
6
有这样一个丑陋的错误 Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass',还有其他人遇到吗?需要翻译为中文。 - Anand Rockzz
我就喜欢简短的回答。 - YTG

39

可以通过数组表示法访问对象的属性:

var method = "smile";
foo[method](); // will execute the method "smile"

11
在对象内调用函数时,需要将函数名作为字符串提供。
var obj = {talk: function(){ console.log('Hi') }};

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work

2
在编写代码时,提供一些注释总是很有帮助的,这样即使在没有上下文的情况下也能理解代码。 - Phil Cooper
添加了一些注释。谢谢! - s.n

5

使用eval方法调用函数可能不是很好的方式。

eval("foo." + method + "()");

在我的情况下很有用,其中foo{fields:[{id:1}]},而methodfields [0]?.id,但我不得不从您提供的答案中删除() - Rorrim

2
我想在这里留一个例子。例如,当提交表单时,我想调用一个动态检查方法。
<form data-before-submit="MyObject.myMethod">
    <button type="submit">Submit</button>
</form>

$('form').on('submit', function(e){
    
    var beforeSubmit = $(this).attr('data-before-submit');

    if( beforeSubmit ){

       params = beforeSubmit.split(".");
       objectName = params[0];
       methodName = params[1];

       result = window[objectName][methodName]($(this));

       if( result !== true ){
           e.preventDefault();
       }

    }

});


var MyObject = {
    myMethod: function(form){
        console.log('worked');
        return true;
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接