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.