124

Can I dynamically call an object method having the method name as a string? I would imagine it like this:

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 Answers 5

262

if the name of the property is stored in a variable, use []

foo[method]();
Sign up to request clarification or add additional context in comments.

3 Comments

it's not working for me using a variable inside a function:const genericResolver = ( table, action , values ) => { return Auth.isAuthenticated() .then(() => { return eval(table).findAll()
If you want to execute a method from another method inside a class, use this['methodName']().
Getting this ugly error Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass' anyone else ?
38

Properties of objects can be accessed through the array notation:

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

Comments

11

When we call a function inside an object, we need provide the name of the function as a String.

var obj = {talk: function(){ console.log('Hi') }};

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

3 Comments

It's always helpful to provide some commentary with your code so it can be understood out of context.
Added some comment. Thanks!
I think: Your last code-line will work, if you declare let talk = 'talk'; obj[talk]() // prints "Hi";
5

method can be call with eval eval("foo." + method + "()"); might not be very good way.

1 Comment

Useful in my case where foo is { fields: [{ id: 1 }] } and method is fields[0]?.id, but I had to remove () from your proposed answer
2

I would like to leave an example here for this. For example; i want to call a dynamically check method while submitting the form.

<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;
    }
};

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.