जावास्क्रिप्ट गतिशील स्ट्रिंग से वस्तु विधि आह्वान


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

जवाबों:


212

यदि संपत्ति का नाम एक चर में संग्रहीत है, तो उपयोग करें []

foo[method]();

1
यह मेरे लिए किसी फंक्शन के अंदर एक वैरिएबल का उपयोग करके काम नहीं कर रहा है: const genericResolver = (table, action, values) => {Auth_isAuthenticated () (.then () => {return eval (table) .findll ()
stackdave लौटें।

यदि आप किसी वर्ग के अंदर किसी अन्य विधि से किसी विधि को निष्पादित करना चाहते हैं, तो इस ['methodName'] () का उपयोग करें।
शांगलिंग

2
यह बदसूरत त्रुटि Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'किसी और को हो रही है?
आनंद रॉकज

33

ऑब्जेक्ट्स के गुणों को सरणी संकेतन के माध्यम से एक्सेस किया जा सकता है:

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

4

जब हम किसी फ़ंक्शन को किसी ऑब्जेक्ट के अंदर कहते हैं, तो हमें फ़ंक्शन का नाम स्ट्रिंग के रूप में प्रदान करने की आवश्यकता होती है।

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

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

2
यह हमेशा आपके कोड के साथ कुछ टिप्पणी प्रदान करने के लिए सहायक होता है ताकि इसे संदर्भ से बाहर समझा जा सके।
फिल कूपर

कुछ टिप्पणी जोड़ी। धन्यवाद!
एसएन

3

विधि के साथ कॉल किया जा सकता है eval eval("foo." + method + "()"); बहुत अच्छा तरीका नहीं हो सकता है।


मेरे मामले में उपयोगी है कि कहां fooहै { fields: [{ id: 1 }] }और क्या methodहै fields[0]?.id, लेकिन मुझे ()आपके प्रस्तावित उत्तर
रोरिम

-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;
    }
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.