Javascript ruft die Objektmethode dynamisch aus der Zeichenfolge auf

94

Kann ich eine Objektmethode mit dem Methodennamen als Zeichenfolge dynamisch aufrufen? Ich würde es mir so vorstellen:

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
quelle

Antworten:

211

Wenn der Name der Eigenschaft in einer Variablen gespeichert ist, verwenden Sie []

foo[method]();
Karoly Horvath
quelle
1
Es funktioniert bei mir nicht mit einer Variablen innerhalb einer Funktion: const genericResolver = (Tabelle, Aktion, Werte) => {return Auth.isAuthenticated () .then (() => {return eval (Tabelle) .findAll ()
stackdave
Wenn Sie eine Methode von einer anderen Methode innerhalb einer Klasse ausführen möchten, verwenden Sie diese ['methodName'] ().
Schlingel
2
Erhalten Sie diesen hässlichen Fehler Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'jemand anderes?
Anand Rockzz
33

Auf Eigenschaften von Objekten kann über die Array-Notation zugegriffen werden:

var method = "smile";
foo[method](); // will execute the method "smile"
Didier Ghys
quelle
3

Methode kann mit eval aufgerufen werden, was eval("foo." + method + "()"); möglicherweise nicht sehr gut ist.

Hakovala
quelle
Nützlich in meinem Fall, wo fooist { fields: [{ id: 1 }] }und methodist fields[0]?.id, aber ich musste ()aus Ihrer vorgeschlagenen Antwort entfernen
Rorrim
3

Wenn wir eine Funktion innerhalb eines Objekts aufrufen, müssen wir den Namen der Funktion als String angeben.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work
sn
quelle
2
Es ist immer hilfreich, einen Kommentar zu Ihrem Code abzugeben, damit er außerhalb des Kontexts verstanden werden kann.
Phil Cooper
Kommentar hinzugefügt. Vielen Dank!
Sn
-1

Ich möchte hier ein Beispiel dafür hinterlassen. Beispielsweise; Ich möchte eine dynamische Prüfmethode aufrufen, während ich das Formular abschicke.

<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
quelle