maksim-korzhov
12/9/2017 - 7:45 PM

function_overloading_with_closures

// Перегрузка функций по количеству параметров
// с использованием замыкания
function addMethod(obj, name, fn) {
  // Сохраняем старую функцию, если не подойдёт количество аргументов
  var old = obj[name];
  
  obj[name] = function() {
    if( fn.length == arguments.length ) {
      return fn.apply(this, arguments);
    } else if(typeof old === "function") {
      return old.apply(this, arguments);
    }
  };
}

var ninja = {
  values: ["Dean Edwards", "Sam Stephenson", "Alex Russel"]
};

/* Создаём 3 метода с разным количеством аргументов */
// Метод не ждёт ничего, возвращает всех мастеров
addMethod(ninja, "find", function() {
  return this.values;
});

// Метод ищет мастера по имени, и если находит - возвращает его.
addMethod(ninja, "find", function(name) {
  var ret = [];
  for( var i = 0; i < this.values.length; i++ ) {
    if(this.values[i].indexOf(name) !== -1) {
      ret.push(this.values[i]);
    }
  }
  
  return ret;
});

// Ищет мастера по имени и фамилии
addMethod(ninja, "find", function(first, last) {
  var ret = [];
  for( var i = 0; i < this.values.length; i++ ) {
    if(this.values[i] == first + " " + last) {
      ret.push(this.values[i]);
    }
  }
  
  return ret;
});

// Проверка вызова в разным количеством аргументов
console.log(ninja.find().length);
console.log(ninja.find("Sam").length);
console.log(ninja.find("Dean", "Edwards").length);
console.log(ninja.find("Alex", "Russel", "Jr") == null);