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.