Javascript dynamically invoke object method from string

72,258

Solution 1

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

foo[method]();

Solution 2

Properties of objects can be accessed through the array notation:

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

Solution 3

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

Solution 4

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

Solution 5

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;
    }
};
Share:
72,258

Related videos on Youtube

Mikulas Dite
Author by

Mikulas Dite

Updated on July 08, 2022

Comments

  • Mikulas Dite
    Mikulas Dite almost 2 years

    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();
    
  • stackdave
    stackdave over 6 years
    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()
  • Phil Cooper
    Phil Cooper over 5 years
    It's always helpful to provide some commentary with your code so it can be understood out of context.
  • s.n
    s.n over 5 years
    Added some comment. Thanks!
  • schlingel
    schlingel over 5 years
    If you want to execute a method from another method inside a class, use this['methodName']().
  • Anand Rockzz
    Anand Rockzz almost 5 years
    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 ?
  • Rorrim
    Rorrim about 4 years
    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
  • YTG
    YTG about 2 years
    I just love short answers.