Javascript appelle dynamiquement la méthode objet à partir de la chaîne

94

Puis-je appeler dynamiquement une méthode objet ayant le nom de la méthode sous forme de chaîne? Je l'imaginerais comme ceci:

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();
Mikulas Dite
la source

Réponses:

212

si le nom de la propriété est stocké dans une variable, utilisez []

foo[method]();
Karoly Horvath
la source
1
ça ne fonctionne pas pour moi en utilisant une variable dans une fonction: const genericResolver = (table, action, values) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave
Si vous souhaitez exécuter une méthode à partir d'une autre méthode à l'intérieur d'une classe, utilisez ce ['methodName'] ().
schlingel
2
Obtenir cette horrible erreur Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'quelqu'un d'autre?
Anand Rockzz
33

Les propriétés des objets sont accessibles via la notation de tableau:

var method = "smile";
foo[method](); // will execute the method "smile"
Didier Ghys
la source
4

Lorsque nous appelons une fonction à l'intérieur d'un objet, nous devons fournir le nom de la fonction sous forme de chaîne.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work
sn
la source
2
Il est toujours utile de fournir des commentaires avec votre code afin qu'il puisse être compris hors de son contexte.
Phil Cooper
Ajout d'un commentaire. Merci!
sn
3

La méthode peut être appelée avec eval eval("foo." + method + "()"); peut ne pas être un très bon moyen.

hakovala
la source
Utile dans mon cas où fooest { fields: [{ id: 1 }] }et methodest fields[0]?.id, mais j'ai dû supprimer ()de votre proposition de réponse
Rorrim
-1

Je voudrais laisser un exemple ici pour cela. Par exemple; Je souhaite appeler une méthode de vérification dynamique lors de la soumission du formulaire.

<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;
    }
};
Ahmeti
la source