Javascript secara dinamis memanggil metode objek dari string

94

Dapatkah saya secara dinamis memanggil metode objek yang memiliki nama metode sebagai string? Saya akan membayangkannya seperti ini:

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
sumber

Jawaban:

212

jika nama properti disimpan dalam variabel, gunakan []

foo[method]();
Karoly Horvath
sumber
1
itu tidak berfungsi untuk saya menggunakan variabel di dalam fungsi: const genericResolver = (table, action, values) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave
Jika Anda ingin mengeksekusi metode dari metode lain di dalam kelas, gunakan ['methodName'] () ini.
schlingel
2
Mendapatkan kesalahan jelek ini, Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'siapa lagi?
Anand Rockzz
33

Properti objek dapat diakses melalui notasi array:

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

Saat kita memanggil fungsi di dalam sebuah objek, kita perlu memberikan nama fungsi tersebut sebagai String.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work
sn
sumber
2
Itu selalu membantu untuk memberikan beberapa komentar dengan kode Anda sehingga dapat dipahami di luar konteks.
Phil Cooper
Menambahkan beberapa komentar. Terima kasih!
sn
3

Metode dapat dipanggil dengan eval eval("foo." + method + "()"); mungkin bukan cara yang sangat baik.

hakovala.dll
sumber
Berguna dalam kasus saya di mana fooadalah { fields: [{ id: 1 }] }dan methodadalah fields[0]?.id, tapi aku harus menghapus ()dari jawaban Anda yang diusulkan
Rorrim
-1

Saya ingin meninggalkan contoh di sini untuk ini. Sebagai contoh; saya ingin memanggil metode pemeriksaan dinamis saat mengirimkan formulir.

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