Javascript, dizeden dinamik olarak nesne yöntemini çağırır


97

Yöntem adını bir dizge olarak içeren bir nesne yöntemini dinamik olarak çağırabilir miyim? Bunu şöyle hayal ediyorum:

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

Yanıtlar:


214

özelliğin adı bir değişkende depolanıyorsa, şunu kullanın []

foo[method]();

2
bir fonksiyonun içinde bir değişken kullanmak benim için çalışmıyor: const genericResolver = (tablo, eylem, değerler) => {return Auth.isAuthenticated () .then (() => {return eval (tablo) .findAll ()
— stackdave

Bir sınıfın içinde başka bir yöntemden bir yöntem yürütmek istiyorsanız, bu ['yöntemAdı'] () kullanın.
— schlingel

2
Bu çirkin hatayı Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'başkası mı alıyorsun?
— Anand Rockzz

33

Nesnelerin özelliklerine dizi notasyonu aracılığıyla erişilebilir:

var method = "smile";
foo[method](); // will execute the method "smile"

4

method ile call eval("foo." + method + "()"); olabilir eval çok iyi bir yol olmayabilir.


Benim durumumda nerede fooolduğu { fields: [{ id: 1 }] }ve methodolduğu fields[0]?.idiçin ()
— kullanışlıdır

4

Bir nesnenin içinde bir işlevi çağırdığımızda, işlevin adını String olarak sağlamamız gerekir.

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

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work

2
Bağlam dışında anlaşılabilmesi için kodunuzla birlikte bazı yorumlar sağlamak her zaman yararlıdır.
— Phil Cooper

Bir yorum eklendi. Teşekkürler!
— sn

0

Bunun için burada bir örnek bırakmak istiyorum. Örneğin; Formu gönderirken dinamik bir kontrol yöntemi çağırmak istiyorum.

<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;
    }
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.