// Перегрузка функций по количеству параметров
// с использованием замыкания
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);