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.