Javascript richiama dinamicamente il metodo dell'oggetto dalla stringa


94

Posso chiamare dinamicamente un metodo oggetto con il nome del metodo come una stringa? Lo immagino in questo modo:

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();

Risposte:


211

se il nome della proprietà è memorizzato in una variabile, utilizzare []

foo[method]();

1
non funziona per me usare una variabile all'interno di una funzione: const genericResolver = (table, action, values) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave

Se vuoi eseguire un metodo da un altro metodo all'interno di una classe, usa questo ['methodName'] ().
schlingel

2
Ottenere questo brutto errore Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'qualcun altro?
Anand Rockzz,

33

È possibile accedere alle proprietà degli oggetti tramite la notazione dell'array:

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

3

metodo può essere chiamato con eval eval("foo." + method + "()"); potrebbe non essere un buon metodo.


Utile nel mio caso in cui fooè { fields: [{ id: 1 }] }ed methodè fields[0]?.id, ma ho dovuto rimuovere ()dal vostro soluzione proposta
Rorrim

3

Quando chiamiamo una funzione all'interno di un oggetto, dobbiamo fornire il nome della funzione come String.

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

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

2
È sempre utile fornire alcuni commenti con il codice in modo che possa essere compreso fuori contesto.
Phil Cooper

Aggiunto qualche commento. Grazie!
Sn

-1

Vorrei lasciare un esempio qui per questo. Per esempio; voglio chiamare un metodo di controllo dinamico durante l'invio del modulo.

<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;
    }
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.