ES2015 और बाद में
ES2015 में, नामांकित मापदंडों को अनुकरण करने के लिए पैरामीटर विनाशकारी का उपयोग किया जा सकता है। किसी ऑब्जेक्ट को पास करने के लिए कॉल करने वाले की आवश्यकता होगी, लेकिन यदि आप डिफ़ॉल्ट पैरामीटर का उपयोग करते हैं, तो आप फ़ंक्शन के सभी चेक से बच सकते हैं:
myFunction({ param1 : 70, param2 : 175});
function myFunction({param1, param2}={}){
// ...function body...
}
// Or with defaults,
function myFunc({
name = 'Default user',
age = 'N/A'
}={}) {
// ...function body...
}
ES5
आप जो चाहते हैं, उसके करीब आने का एक तरीका है, लेकिन यह Function.prototype.toString
[ES5] के आउटपुट पर आधारित है , जो कार्यान्वयन के लिए कुछ हद तक निर्भर है, इसलिए यह क्रॉस-ब्राउज़र संगत नहीं हो सकता है।
फ़ंक्शन के स्ट्रिंग प्रतिनिधित्व से पैरामीटर नामों को पार्स करने का विचार है ताकि आप किसी ऑब्जेक्ट के गुणों को संबंधित पैरामीटर के साथ जोड़ सकें।
एक फ़ंक्शन कॉल तब दिख सकता है
func(a, b, {someArg: ..., someOtherArg: ...});
जहां a
और b
तर्कपूर्ण तर्क हैं और अंतिम तर्क नामित तर्क के साथ एक वस्तु है।
उदाहरण के लिए:
var parameterfy = (function() {
var pattern = /function[^(]*\(([^)]*)\)/;
return function(func) {
// fails horribly for parameterless functions ;)
var args = func.toString().match(pattern)[1].split(/,\s*/);
return function() {
var named_params = arguments[arguments.length - 1];
if (typeof named_params === 'object') {
var params = [].slice.call(arguments, 0, -1);
if (params.length < args.length) {
for (var i = params.length, l = args.length; i < l; i++) {
params.push(named_params[args[i]]);
}
return func.apply(this, params);
}
}
return func.apply(null, arguments);
};
};
}());
जिसे आप निम्न के रूप में उपयोग करेंगे:
var foo = parameterfy(function(a, b, c) {
console.log('a is ' + a, ' | b is ' + b, ' | c is ' + c);
});
foo(1, 2, 3); // a is 1 | b is 2 | c is 3
foo(1, {b:2, c:3}); // a is 1 | b is 2 | c is 3
foo(1, {c:3}); // a is 1 | b is undefined | c is 3
foo({a: 1, c:3}); // a is 1 | b is undefined | c is 3
डेमो
इस दृष्टिकोण में कुछ कमियां हैं (आपको चेतावनी दी गई है!):
- यदि अंतिम तर्क एक वस्तु है, तो इसे "नामित तर्क ऑब्जेक्ट" के रूप में माना जाता है
- आपको फ़ंक्शन में परिभाषित करने के लिए हमेशा उतने ही तर्क मिलेंगे, लेकिन उनमें से कुछ का मूल्य हो सकता है
undefined
(यह सभी के लिए कोई मूल्य नहीं होने से अलग है)। इसका मतलब है कि आप यह arguments.length
परीक्षण करने के लिए उपयोग नहीं कर सकते कि कितने तर्क पारित किए गए हैं।
रैपर बनाने वाले फ़ंक्शन के बजाय, आपके पास एक फ़ंक्शन भी हो सकता है जो फ़ंक्शन और विभिन्न मानों को तर्क के रूप में स्वीकार करता है, जैसे कि
call(func, a, b, {posArg: ... });
या यहां तक कि विस्तार करें Function.prototype
ताकि आप कर सकें:
foo.execute(a, b, {posArg: ...});