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

Antworten:


211

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

foo[method]();

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"

3

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


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

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;
    }
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.