जावास्क्रिप्ट कार्यों या सी-शैली के प्रोटोटाइप के लिए भारी वजन के बिना तर्क

कई को वैकल्पिक फ़ंक्शन तर्कों का उपयोग करने की आवश्यकता का सामना करना पड़ा। यदि इस तरह का एक तर्क है, और यहां तक ​​कि आखिरी भी है, तो कोई विशेष समस्याएं नहीं हैं।

function set(name, value){ if(value == undefined){ value = name; } ... } 


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

 function send(data){ if(arguments[1] instanceof Function){ var callback = arguments[1]; var options = null; } else if(arguments[2] instanceof Function){ var callback = arguments[2]; var options = arguments[1]; } ... } 


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

 function send(){ function __send(id, data){ ... } if(arguments[0] instanceof Array){ var pack = arguments[0]; var callback = arguments[1]; for(var i=0; i<pack.length; i++){ __send.apply(this, pack[i]); } } } 


पैक एक द्वि-आयामी सरणी है।

ऐसा लगता है कि सब कुछ, चालें समाप्त हो गईं, लेकिन जीवन एक और तर्क, इसके अलावा, पूरे पैक को फेंक देता है। लगभग इस तरह के आयोजनों से मुझे तर्कों को पार्स करने के लिए एक सरल और अधिक सुंदर तरीके की आवश्यकता का एहसास हुआ। विचार के एक पल ने मुझे सी-जैसे प्रोटोटाइप का उपयोग करने के लिए प्रेरित किया। विचार यह है। हम एक ऐसा वर्ग बनाते हैं जिसके निर्माता तर्क लेते हैं, और इसकी जाँच पद्धति यह जाँचती है कि तर्क एक या दूसरे प्रोटोटाइप के अनुरूप हैं या नहीं।
यह स्पष्ट करने के लिए कि यह कैसे काम करता है, पहले मैं उपयोग का एक उदाहरण देता हूं। हम नए तर्क कहते हैं, आगे की हलचल के बिना, newArg।

 function send(){ function __send(){ var args = new argSchema(arguments); if(args.checkin('number id', 'object data', 'opt bool newArg', 'opt function callback')){ //  args.id, args.data, args.newArg, args.callback ... } ... } var args = new argSchema(arguments); if(args.checkin('array pack', 'opt bool newArg', 'opt function callback')){ for(var i=0; i<pack.length; i++){ __send.apply(this, args.pack[i]); } } else if(args.checkin('number id', 'object data', 'opt bool newArg', 'opt function callback')){ __send(args.id, args.data, args.newArg, args.callback); } } 


और अगर जीवन हमें एक और वैकल्पिक तर्क देता है, तो हम इसे डर के बिना संलग्न कर सकते हैं कि पार्सिंग तर्कों के तर्क को तोड़ दें।

अब कोड ही:

 var is = function( type, obj ) { return Object.prototype.toString.call( obj ) === "[object "+ type +"]"; } is['string'] = function(obj){ return (typeof obj == 'string' || obj instanceof String); } is.number = function(obj){ return (typeof obj == 'number' || obj instanceof Number); } is.bool = function(obj){ return (typeof obj == 'boolean' || obj instanceof Boolean); } is.object = function(obj){ return (typeof obj == 'object'); } is.array = function(obj){ return (obj instanceof Array); } is.func = function(obj){ return (obj instanceof Function); } is.set = function(obj){ return (obj != undefined && obj != null); } is.unset = function(obj){ return !this.set(obj); } function argSchema(argArr){ this.checkin = function(){ var arr, qual, type, name; function check(type, arg){ if(is.unset(arg)) return true; switch(type){ case 'string': if(is.string(arg)){ this[name] = arg; } else return false; break; case 'number': if(is.number(arg)){ this[name] = arg; } else return false; break; case 'bool': if(is.bool(arg)){ this[name] = arg; } else return false; break; case 'object': if(is.object(arg)){ this[name] = arg; } else return false; break; case 'function': if(is.func(arg)){ this[name] = arg; } else return false; break; case 'array': if(is.array(arg)){ this[name] = arg; } else return false; break; } return true; } for(var i=0, j=0; i<arguments.length; i++){ arr = arguments[i].split(' '); qual = type = name = null; if(arr.length == 3){ qual = arr[0]; type = arr[1]; name = arr[2]; } else if(arr.length == 2){ type = arr[0]; name = arr[1]; } delete this[name]; if(qual == 'opt'){ if(check.call(this, type, argArr[j])){ j++; } } else{ if(!check.call(this, type, argArr[j])) return false; j++; } } return true; } } 


पाठ में उदाहरण पूरी तरह से व्याख्यात्मक हैं और प्रदर्शन के लिए परीक्षण नहीं किया गया है। लेकिन यहां आप एक काम करने वाला उदाहरण देख सकते हैं।

Source: https://habr.com/ru/post/In195816/


All Articles