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

Jawaban:


212

jika nama properti disimpan dalam variabel, gunakan []

foo[method]();

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"

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

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.


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;
    }
};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.