2011-01-28 15 views
11

आप निम्नलिखित हस्ताक्षरों के साथ दो कार्य है कहते हैं:किसी निश्चित हस्ताक्षर के साथ जावास्क्रिप्ट फ़ंक्शन का पता कैसे लगाया गया है?

  1. addClass(class)
  2. addClass(class, duration)

ये जो अनुमान लगाने के लिए एक तीसरी पार्टी पुस्तकालय में रहते हैं (कोई ईनाम नहीं !!)

यदि आप दो पैरामीटर के साथ addClass() पर कॉल करते हैं लेकिन केवल हस्ताक्षर 1 पंजीकृत है, तो कोई त्रुटि नहीं होगी और हस्ताक्षर 1 कॉल किया जाएगा। दूसरा पैरामीटर अनदेखा किया जाता है।

तो क्या दो पैरामीटर के साथ हस्ताक्षर 2 का पता लगाने का कोई तरीका है?

+4

आप जानते हैं कि यदि आप दो तर्कों के साथ एकल-तर्क संस्करण को कॉल कर सकते हैं तो यह केवल दूसरे तर्क को अनदेखा कर देगा, मुझे लगता है? – lonesomeday

उत्तर

25

आप हस्ताक्षर की जांच करने के लिए फ़ंक्शन ऑब्जेक्ट की length संपत्ति का उपयोग कर सकते हैं। उदाहरण:

function x(a) {} 
function y(a,b) {} 

alert(x.length); // shows "1" 
alert(y.length); // shows "2" 
8

जावास्क्रिप्ट में कोई मूल विधि ओवरलोडिंग नहीं है। आप बना सकते हैं अपने खुद के, हालांकि: http://ejohn.org/blog/javascript-method-overloading/

:

तो अगर आप

function addClass(class) { console.log('1 arg'); }; 
function addClass(class, duration) { console.log('2 args'); }; 

दूसरा कोई एक कार्य करें (अपडेट 11/5/15 लिंक मृत प्रतीत हो रहा है, यहाँ Google Cache version है) पहले को ओवरराइट करता है। तो अगर आप "addClass (1)" को भी कॉल करते हैं, तो आउटपुट अभी भी "2 तर्क" होगा।

someObject.addClass = function(a) {...} 
someObject.addClass = function(a, b) {...} 

जैसा पहला "संस्करण" खो जाएगा।

+0

+1 [लिंक] के लिए +1 (http://ejohn.org/blog/javascript-method-overloading/) – jwaliszko

+0

लिंक मर चुका है – Alex

+0

@Alex धन्यवाद, मैंने Google कैश लिंक जोड़ा है –

3

हासिल करना बहुत मुश्किल नहीं है, लेकिन रेसिग की विधि बहुत अधिक नहीं है, क्योंकि यह केवल तर्क की लंबाई के लिए जांचता है, जो केवल वास्तविक कॉल हस्ताक्षर से संबंधित है।

जोहान्स विधि वास्तव में एकाधिक कॉल हस्ताक्षर नहीं ओवरराइड करने की विधि है, और जेएस सख्त मोड में असफल हो जाएगा जहां एक ही नाम की एकाधिक फ़ंक्शन घोषणा प्रतिबंधित है।

ठीक से लागू करने के लिए आप एक प्रकार/अस्तित्व की जांच में प्रत्येक कॉल हस्ताक्षर लपेटकर, कॉल अग्रेषण के माध्यम से इसे लागू करने की आवश्यकता होगी:

function myFunction(arg1, arg2, arg3){ 
    switch(true){ 
    case arg1 instanceof someObject: 
     myFunction_signature1.apply(this, arguments); 
     break; 
    case typeof arg1 === "string": 
     myFunction_signature2.apply(this, arguments); 
     break; 
    } 
} 

यह जब कुछ पैरामीटर के रूप में अच्छी तरह से वैकल्पिक हैं एक छोटे से अधिक जटिल हो जाता है।

0

यदि आप नोड का उपयोग कर रहे हैं तो आप func.toString() का उपयोग कर सकते हैं और उपयोग किए जा रहे हस्ताक्षर प्राप्त करने के परिणाम को पार्स कर सकते हैं।

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

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