JavaScript dynamicznie wywołuje metodę obiektu z ciągu znaków

95

Czy mogę dynamicznie wywołać metodę obiektu o nazwie metody w postaci ciągu? Wyobrażałbym to tak:

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
źródło

Odpowiedzi:

212

jeśli nazwa właściwości jest przechowywana w zmiennej, użyj []

foo[method]();
Karoly Horvath
źródło
2
to nie działa dla mnie, używając zmiennej wewnątrz funkcji: const genericResolver = (tabela, akcja, wartości) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave
Jeśli chcesz wykonać metodę z innej metody wewnątrz klasy, użyj this ['nazwaMetody'] ().
schlingel
2
Dostajesz ten brzydki błąd Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'?
Anand Rockzz
33

Dostęp do właściwości obiektów można uzyskać poprzez notację tablicową:

var method = "smile";
foo[method](); // will execute the method "smile"
Didier Ghys
źródło
4

metoda może być wywołana z eval eval("foo." + method + "()"); może nie być dobrym sposobem.

hakovala
źródło
Przydatne w moim przypadku, gdzie foojest { fields: [{ id: 1 }] }i methodjest fields[0]?.id, ale musiałem usunąć ()z proponowanej odpowiedzi
Rorrim
4

Kiedy wywołujemy funkcję wewnątrz obiektu, musimy podać nazwę funkcji jako String.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work
sn
źródło
2
Zawsze pomocne jest dodanie komentarza do kodu, aby można go było zrozumieć poza kontekstem.
Phil Cooper,
Dodano komentarz. Dzięki!
sn
-1

Chciałbym tutaj zostawić przykład. Na przykład; chcę wywołać metodę dynamicznego sprawdzania podczas przesyłania formularza.

<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
źródło