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: ...});