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

Odpowiedzi:


212

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

foo[method]();

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"

4

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


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

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;
    }
};
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.