Skip to content

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 方法定义了三个重载:

  1. find0 不带参数,返回所有的 people
  2. find1 带一个参数,返回 first name 匹配的 people
  3. find2 带两个参数,返回 first name 和 last name 都匹配的 people

而调用时只需要调用 find 方法就行了。


原文:能看懂这 10 个 JavaScript 难点的程序员运气不会太差…