1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
function setDefaultArgs (fn, defaultArgs) { function getParameterNames (fn) { const COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; const FAT_ARROWS = /=>.*$/mg; const DEFAULT_PARAMS = /=[^,]+/mg;
const code = fn.toString() .replace(COMMENTS, '') .replace(FAT_ARROWS, '') .replace(DEFAULT_PARAMS, '');
const result = code.slice(code.indexOf('(') + 1, code.indexOf(')')) .match(/([^\s,]+)/g);
return result || []; }
const names = getParameterNames(fn);
const functionTemplate = (fn, names, defaultArgs) => function ($PARAMS$) { const fixedArgs = Array(names.length).fill('_').map((_, i) => arguments[i] || defaultArgs[names[i]] || defaultArgs[i]); return fn.apply(this, fixedArgs); };
const template = `"use strict"; return ${functionTemplate}` .replace('$PARAMS$', names.join(', ')) .replace(/^ {4}/gm, '');
return Function(template)()(fn, names, defaultArgs); }
Function.prototype.setDefaultArgs = function (defaultArgs) { return setDefaultArgs(this, defaultArgs); };
|