2013-10-12 11 views
12

क्या call या apply या किसी अन्य तरीके से लागू करके ऑब्जेक्ट को कॉल करने योग्य संभव है? उदा .:क्या आप ऑब्जेक्ट 'कॉल करने योग्य' बना सकते हैं?

var obj = {}; 
obj.call = function (context, arg1, arg2, ...) { 
    ... 
}; 

... 

obj (a, b); 
+3

नहीं, यह संभव नहीं है। एक वस्तु को तत्काल कार्य के रूप में "जन्म" कॉल करने योग्य होना चाहिए। – Pointy

+0

संभावित डुप्लिकेट [जावास्क्रिप्ट में कॉल करने योग्य ऑब्जेक्ट के लिए निर्माता] (http://stackoverflow.com/questions/12656079/constructor-for-callable-object-in-javascript) –

+0

@ हंसज़ वास्तव में नहीं, मेरा प्रश्न एक * मौजूदा * वस्तु कॉल करने योग्य, एक नया निर्माण नहीं कर रहा है। – Septagram

उत्तर

13

नहीं, लेकिन आप एक फ़ंक्शन पर गुण जोड़ सकते हैं, उदा।

function foo(){} 
foo.myProperty = "whatever"; 

संपादित करें: करने के लिए एक वस्तु प्रतिदेय "बनाना", यदि आप ऊपर करना होगा, लेकिन यह कुछ ऐसा दिखाई दे सकता है:

// Augments func with object's properties 
function makeCallable(object, func){ 
    for(var prop in object){ 
     if(object.hasOwnProperty(prop){ 
      func[prop] = object[prop]; 
     } 
    } 
} 

और फिर आप बस का उपयोग करेंगे " func "ऑब्जेक्ट के बजाय फ़ंक्शन। वास्तव में यह सभी विधि दो वस्तुओं के बीच प्रतिलिपि गुण है, लेकिन ... यह आपकी मदद कर सकती है।

+0

हां लेकिन आप प्रोटोटाइप श्रृंखला की प्रतिलिपि कैसे बनाते हैं? मुझे एक फ़ंक्शन/ऑब्जेक्ट की आवश्यकता है जो कॉल करने योग्य है, लेकिन वास्तव में एक प्रकार का उदाहरण है। –

+0

मेरी इच्छा है कि आप एक ऑब्जेक्ट कॉल करने योग्य सेट कर सकें जैसे 'obj [Symbol.invoke] = function (args) {}; ' –

9

ES6 इस के लिए बेहतर समाधान है। यदि आप अपनी ऑब्जेक्ट्स को एक अलग तरीके से बनाते हैं (class, extend आईएनजी 'फंक्शन' प्रकार का उपयोग करके), तो आप इसका एक कॉल करने योग्य उदाहरण प्राप्त कर सकते हैं।

यह भी देखें: How to extend Function with ES6 classes?

+0

मैं इसे बेहतर नहीं कहूंगा। उस समाधान ने प्रमुख ब्राउज़र द्वारा बेहतर समर्थन किया जो वास्तव में लोगों को विकल्प के बजाय उस का उपयोग करने के लिए मजबूर करता है। लेकिन यह इस समाधान को बिल्कुल बेहतर नहीं बनाता है। यह समाधान काउंटर-अंतर्ज्ञानी है और वैकल्पिक ओओपी दृष्टिकोण के साथ संगत नहीं है। – wandalen

+0

@wandalen मुझे डर है मैं समझ नहीं पा रहा हूं कि आप क्या कहना चाहते हैं। किसी भी तरह से, एक और अधिक पठनीय, क्लीनर, और (वास्तव में यह है) अंतर्ज्ञानी (कम से कम उन लोगों के लिए जो सी ++ या जावा - ओओपी से आ रहे हैं) समाधान बेहतर है, है ना? आपको कॉल करने योग्य बनाने के लिए 'फंक्शन' का विस्तार करने वाला वर्ग क्यों लगता है, सहज नहीं है? – 0xc0de

संबंधित मुद्दे