js-study-part4-task1
by tigeral
HTML
<!--
Создать ф-цию partialApply, которая могла бы частично применить другую заданную ф-цию (частично применить - значит задать значения нескольких параметров, начиная слева. Оставшиеся незаданные параметры - будут параметрами новой возвращенной из partialApply ф-ции).
Например, у нас есть ф-ция, складывающая два числа:
function sum(a,b) { return a + b;}
А мы хотим на ее основе получить другую функцию - которая прибавляет к заданному числу тройку, след образом:
var add3 = partialApply(sum, 3);
add3(10); //=> 13;
-->
JavaScript
// firstArg is required to avoid the partialApply method call without arguments
var partialApply = function(func, firstArg) {
var partialArgs = Array.prototype.slice.call(arguments, 1);
var wrapperFunc = function() {
var args = Array.from(arguments);
return func.apply(this, partialArgs.concat(args));
};
wrapperFunc['length'] = Math.max(func.length - partialArgs.length, 0);
return wrapperFunc;
};
Function.prototype['partialApply'] = function() {return partialApply.bind(this, this);};
f1 = function(a,b,c,d) {
console.log(this);
console.log(arguments);
};
var obj1 = {id: 1, f1: f1};
var obj2 = {id: 2};
f2 = partialApply(f1, 1,2);
// f2(3,4);
obj1.f1(1,2,3,4);
f1.apply(obj2, [1,2,3,4]);
f2.apply(obj2, [1,4]);