JS 函数重载
🏷️ JavaScript
这个厉害了,JS 中的函数 重载 方法(虽然只能根据参数数量重载)。
javascript
function addMethod(object, name, f)
{
var old = object[name];
object[name] = function()
{
// f.length 为函数定义时的参数个数
// arguments.length 为函数调用时的参数个数
if (f.length === arguments.length)
{
return f.apply(this, arguments);
}
else if (typeof old === "function")
{
return old.apply(this, arguments);
}
};
}
// 不传参数时,返回所有 name
function find0()
{
return this.names;
}
// 传一个参数时,返回 firstName 匹配的 name
function find1(firstName)
{
var result = [];
for (var i = 0; i < this.names.length; i++)
{
if (this.names[i].indexOf(firstName) === 0)
{
result.push(this.names[i]);
}
}
return result;
}
// 传两个参数时,返回 firstName 和 lastName 都匹配的 name
function find2(firstName, lastName)
{
var result = [];
for (var i = 0; i < this.names.length; i++)
{
if (this.names[i] === (firstName + " " + lastName))
{
result.push(this.names[i]);
}
}
return result;
}
var people = {
names: ["Dean Edwards", "Alex Russell", "Dean Tom"]
};
addMethod(people, "find", find0);
addMethod(people, "find", find1);
addMethod(people, "find", find2);
console.log(people.find()); // 输出 ["Dean Edwards", "Alex Russell", "Dean Tom"]
console.log(people.find("Dean")); // 输出 ["Dean Edwards", "Dean Tom"]
console.log(people.find("Dean", "Edwards")); // 输出 ["Dean Edwards"]
上面的 find
方法定义了三个重载:
find0
不带参数,返回所有的 peoplefind1
带一个参数,返回 first name 匹配的 peoplefind2
带两个参数,返回 first name 和 last name 都匹配的 people
而调用时只需要调用 find
方法就行了。