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.