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]);