JavaScriptは文字列からオブジェクトメソッドを動的に呼び出します


94

メソッド名を文字列として持つオブジェクトメソッドを動的に呼び出すことはできますか?私はそれを次のように想像します:

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

回答:


211

プロパティの名前が変数に格納されている場合は、 []

foo[method]();

1
関数内の変数を使用してそれが機能しない:const genericResolver =(table、a​​ction、values)=> {return Auth.isAuthenticated().then(()=> {return eval(table).findAll()
stackdave

クラス内の別のメソッドからメソッドを実行する場合は、this ['methodName']()を使用します。
シュリンゲル

2
この醜いエラーをElement implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'他の誰かに教えてもらえますか?
Anand Rockzz

33

オブジェクトのプロパティには、配列表記を使用してアクセスできます。

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

3

メソッドはevalで呼び出すことができるので eval("foo." + method + "()"); 、あまり良い方法ではないかもしれません。


私の場合に有用fooされる{ fields: [{ id: 1 }] }methodされてfields[0]?.id、私は削除する必要がありましたが、()あなたの提案の答えから
Rorrim

3

オブジェクト内で関数を呼び出す場合、関数の名前を文字列として提供する必要があります。

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

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

2
コンテキスト外で理解できるように、コードにコメントを付けると常に役立ちます。
Phil Cooper、

コメントを追加しました。ありがとう!
2018

-1

この例をここに残したいと思います。例えば; フォームの送信中に動的にチェックするメソッドを呼び出したいです。

<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;
    }
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.