दिलचस्प पोस्ट
JSF कैश स्टेटिक संसाधन फ़िल्टर WPF में उलटा बूलियन गुण कैसे बाँटें? आराम एपीआई सर्वश्रेष्ठ अभ्यास: कैसे इनपुट के रूप में पैरामीटर मूल्यों की सूची को स्वीकार करने के लिए प्रति चक्र में अधिकतम 4 एफएलओपी सैद्धांतिक अधिकतम कैसे प्राप्त करूं? सी # में रीडोनली के रूप में क्षेत्र को चिह्नित करने के क्या लाभ हैं? स्विफ्ट से सी कैसे कॉल करें? अब जावा वेब फ्रेमवर्क का चयन करना है? PHP के साथ बहुत बड़े अपलोड विज़ुअल स्टूडियो में 'वेब साइट' और 'प्रोजेक्ट' के बीच का अंतर कैसे StackPanel के बच्चों को अधिकतम स्थान नीचे की ओर भरने के लिए? अमेज़ॅन s3 को एचटीएमएल, जावास्क्रिप्ट और अजाक्स अनुरोध के साथ jQuery के साथ छवि अपलोड करना (कोई PHP नहीं) क्या एचटीटीपी क्लाइंट और एचटीटीपी क्लाइंटहैंडलर को निपटा जाना है? क्यों लंबे समय के बजाय पूर्णांक का उपयोग करें? पायथन क्यों साझा ऑब्जेक्ट नहीं ढूँढ सकता जो कि sys.path में निर्देशिका में हैं? शेल को समाप्त करने के लिए प्रतीक्षा करें, फिर कक्षों को प्रारूपित करें – सिंक्रनाइज़ कमांड को निष्पादित करें

जावास्क्रिप्ट में विधि ओवरलोडिंग

मैं अपने जावास्क्रिप्ट कोड में नीचे दिए गए तरीकों का उपयोग कर रहा हूं I

function somefunction() { //1st function } function somefunction(a) { //2nd function } function somefunction(a,b) { //3rd function } somefunction(); // function call goes here 

मुझे समझ में नहीं आ रहा है कि अगर मैं किसी फ़ंक्शन को कॉल करता हूं somefunction() जावास्क्रिप्ट को पहले फ़ंक्शन पर कॉल करना चाहिए, लेकिन समस्या जावास्क्रिप्ट वास्तव में तीसरे फ़ंक्शन को कहती है । ऐसा क्यों है? मैं 1 और 2 फ़ंक्शन को कैसे कॉल कर सकता हूं? इसका कारण क्या है? जावास्क्रिप्ट में विधि अधिभार को लागू करने का कोई उचित तरीका है? उद्योग मानक क्या है?

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट में विधि ओवरलोडिंग"

जावास्क्रिप्ट विधि ओवरलोडिंग का समर्थन नहीं करता (जावा या समान रूप में), आपका तीसरा कार्य पिछले घोषणाओं को ओवरराइट करता है

इसके बजाय, यह arguments ऑब्जेक्ट के माध्यम से चर बहस का समर्थन करता है। तुम यह कर सकते थे

 function somefunction(a, b) { if (arguments.length == 0) { // a, b are undefined // 1st body } else if (arguments.length == 1) { // b is undefined // 2nd body } else if (arguments.length == 2) { // both have values // 3rd body } // else throw new SyntaxError? } 

आप केवल typeof a == "undefined" आदि के typeof a == "undefined" लिए जांच कर सकते हैं, यह किसी somefunction(undefined) कॉल somefunction(undefined) अनुमति देगा, जहां arguments.length 1 यह आसान करने के लिए विभिन्न पैरामीटरों से कॉल करने की इजाजत दे सकता है, उदाहरण के लिए जब आपके पास संभवतः खाली चर है

आप प्रत्येक नए घोषणा के साथ चर किसी भी कार्य को मिटा रहे हैं।

यह समतुल्य है

  window.somefunction = function(... window.somefunction = function(... window.somefunction = function(... 

जावास्क्रिप्ट विधि ओवरलोडिंग की पेशकश नहीं करता है।

उचित तरीका या तो है:

  • तीसरे कार्य को परिभाषित करने के लिए और यह निर्धारित करने के लिए कि कौन-से पैरामीटर परिभाषित किए गए हैं
  • पैरामीटर वाले केवल एक वस्तु को पारित करने के लिए (जो वास्तव में अलग नहीं है, लेकिन क्लीनर है)

जेएस प्रदान नहीं किए गए किसी भी पैरामीटर पर undefined होगा। यदि आप ओवरलोडिंग की तरह कुछ चाहते हैं, तो आपको निम्न कोड के समान कुछ करना होगा:

 function someFunction(a, b) { if (typeof a === 'undefined') { // Do the 0-parameter logic } else if (typeof b === 'undefined') { // Do the 1-parameter logic } else { // Do the 2-parameter logic } } 

आप जावास्क्रिप्ट में तरीकों अधिभार नहीं कर सकते। जावास्क्रिप्ट में, फ़ंक्शंस चर में संग्रहीत होते हैं। वैश्विक चर विंडो वस्तु पर संग्रहीत हैं आपके पास एक ही नाम के साथ एक ही प्रॉपर्टी (एकमात्र कुंजी हैश) हो सकती है

आप क्या कर सकते हैं, सबसे मापदंडों के साथ परिभाषा को परिभाषित कर रहे हैं और यह देखने के लिए जांचें कि कितने पास में पारित किए गए थे

 function Test(a, b, c) { if(typeof a == 'undefined') { a = 1; } if(typeof b == 'undefined') { b = "hi"; } if(typeof c == 'undefined') { c = Date.Now; } } 

अब अगर मैं टेस्ट () पर कॉल करता हूं, तो यह कार्य करेगा जैसे कि मैं Test(1, "hi", Date.Now)

जावास्क्रिप्ट में कोई वास्तविक फ़ंक्शन ओवरलोडिंग नहीं है क्योंकि यह किसी भी प्रकार के किसी भी मापदंड को पारित करने की अनुमति देता है। सबसे अच्छा अभ्यास इस तरह से एक समारोह बनाने के लिए होगा: myfunc (ऑप्ट)

 { // with opt = {'arg1':'a1','arg2':2, etc}, then check your opt inside of the function } 

मैंने यहाँ वर्णित इस समस्या का एक शानदार समाधान विकसित करने की कोशिश की। और आप यहां डेमो पा सकते हैं। उपयोग इस प्रकार दिखता है:

 var out = def({ 'int': function(a) { alert('Here is int '+a); }, 'float': function(a) { alert('Here is float '+a); }, 'string': function(a) { alert('Here is string '+a); }, 'int,string': function(a, b) { alert('Here is an int '+a+' and a string '+b); }, 'default': function(obj) { alert('Here is some other value '+ obj); } }); out('ten'); out(1); out(2, 'robot'); out(2.5); out(true); 

यह हासिल करने के लिए इस्तेमाल किए जाने वाले तरीके:

 var def = function(functions, parent) { return function() { var types = []; var args = []; eachArg(arguments, function(i, elem) { args.push(elem); types.push(whatis(elem)); }); if(functions.hasOwnProperty(types.join())) { return functions[types.join()].apply(parent, args); } else { if (typeof functions === 'function') return functions.apply(parent, args); if (functions.hasOwnProperty('default')) return functions['default'].apply(parent, args); } }; }; var eachArg = function(args, fn) { var i = 0; while (args.hasOwnProperty(i)) { if(fn !== undefined) fn(i, args[i]); i++; } return i-1; }; var whatis = function(val) { if(val === undefined) return 'undefined'; if(val === null) return 'null'; var type = typeof val; if(type === 'object') { if(val.hasOwnProperty('length') && val.hasOwnProperty('push')) return 'array'; if(val.hasOwnProperty('getDate') && val.hasOwnProperty('toLocaleTimeString')) return 'date'; if(val.hasOwnProperty('toExponential')) type = 'number'; if(val.hasOwnProperty('substring') && val.hasOwnProperty('length')) return 'string'; } if(type === 'number') { if(val.toString().indexOf('.') > 0) return 'float'; else return 'int'; } return type; }; 

मुझे समझ में नहीं आ रहा है कि अगर मैं किसी फ़ंक्शन को कॉल करता हूं () जावास्क्रिप्ट को पहले फ़ंक्शन पर कॉल करना चाहिए, लेकिन समस्या जावास्क्रिप्ट वास्तव में तीसरे फ़ंक्शन को कहती है।

यह व्यवहार की उम्मीद है

ऐसा क्यों है ?

मुद्दा यह है कि जावास्क्रिप्ट अर्थपूर्ण रूप से ओवरलोडिंग विधि का समर्थन नहीं करता है। इसलिए, यदि वह दो या अधिक फ़ंक्शंस देखता है / उसी नाम से फ़र्श करता है तो यह अंतिम परिभाषित फ़ंक्शन पर विचार करेगा और पिछले वाले को ओवरराइट करेगा।

ऐसा क्यों है ? मैं 1 और 2 फ़ंक्शन को कैसे कॉल कर सकता हूं? इसका कारण क्या है?

जिस तरह से मुझे लगता है कि ज्यादातर मामलों के लिए उपयुक्त है, इस प्रकार है –

कहें कि आपके पास विधि है

 function foo(x) { } 

इसके बजाय ओवरलोडिंग विधि जो जावास्क्रिप्ट में संभव नहीं है आप एक नई विधि को परिभाषित कर सकते हैं

 fooNew(x,y,z) { } 

और उसके बाद 1 फ़ंक्शन को संशोधित करें –

 function foo(x) { if(arguments.length==2) { return fooNew(arguments[0], arguments[1]); } } 

अगर आपके पास ऐसे कई ओवरलोड किए गए तरीकों पर विचार किया जाता है तो सिर्फ if-else बयानों की तुलना में switch का उपयोग switch

विधि अधिभार करने का एक उचित तरीका है? उद्योग मानक क्या है?

जावास्क्रिप्ट में विधि अतिभारित करने के लिए ऐसा कोई मानक या अधिक सिद्ध विधि नहीं है। किसी को अपने प्रोग्रामिंग डिजाइन के लिए सबसे अच्छा सूट करना चाहिए। मैं कहता हूं कि तर्क के आधार पर साधारण प्रकार की जाँच के साथ लंबाई जो कि यह अपरिभाषित नहीं है पर्याप्त होना चाहिए।

( अधिक विवरण )

विधि ओवरलोडिंग सीधे जावास्क्रिप्ट में समर्थित नहीं है। यहां एक उदाहरण दिया गया है कि आप इसे कैसे दिखा सकते हैं जैसा कि नीचे दिखाया गया है:

 function overloadMethod(object, name, fn){ if(!object._overload){ object._overload = {}; } if(!object._overload[name]){ object._overload[name] = {}; } if(!object._overload[name][fn.length]){ object._overload[name][fn.length] = fn; } object[name] = function() { if(this._overload[name][arguments.length]) return this._overload[name][arguments.length].apply(this, arguments); }; } function Students(){ overloadMethod(this, "find", function(){ // Find a student by name }); overloadMethod(this, "find", function(first, last){ // Find a student by first and last name }); } var students = new Students(); students.find(); // Finds all students.find("Rahul"); // Finds students by name students.find("Rahul", "Mhatre"); // Finds users by first and last name 

स्रोत: स्रोत

तर्क वस्तु को अवधारणा की तरह एक अतिव्यापी विधि बनाने के लिए उपयोग किया जाता है

तर्क एक विशेष प्रकार का ऑब्जेक्ट है जो फ़ंक्शन निष्पादन प्रसंग के भीतर ही उपलब्ध है।

arguments.length गुण समारोह में पारित पैरामीटर की संख्या की पहचान करने के लिए उपयोग किया जाता है।

आप नकली विधि ओवरलोडिंग बनाने के लिए प्रथम श्रेणी फ़ंक्शंस का बेहतर उपयोग कर सकते हैं। पूरी अवधारणा को अपनी वेबसाइट पर समझाया गया है: जावास्क्रिप्ट में अधिभार कार्य