JavaScript関数の再ロード

1766 ワード

転載してから:作者Funebugと本文の住所:https://blog.fundebug.com/2017/07/24/javascript_metho_overloading/
function addMethod(object, name, fn)
{
    var old = object[name];
    object[name] = function()
    {
        if (fn.length == arguments.length)
            return fn.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;
}
function Users()
{
    addMethod(Users.prototype, "find", find0);
    addMethod(Users.prototype, "find", find1);
    addMethod(Users.prototype, "find", find2);
}
var users = new Users();
users.names = ["John Resig", "John Russell", "Dean Tom"];
console.log(users.find()); //   [ 'John Resig', 'John Russell', 'Dean Tom' ]
console.log(users.find("John")); //   [ 'John Resig', 'John Russell' ]
console.log(users.find("John", "Resig")); //   [ 'John Resig' ]
console.log(users.find("John", "E", "Resig")); //   undefined