/*给某个对象添加方法的函数*/
function addMethod(object, name, fn) {
var old = object[name];
//第一次old是 undefined
object[name] = function() {
//若是调用函数的参数长度等于fn的参数长度,那就返回当前函数
if (fn.length == arguments.length) {
return fn.apply(this, arguments);
} else if (typeof old == 'function') {
//若是当前的调用不匹配那么调用上一次的old,直到匹配为止
return old.apply(this, arguments);
}
}
}
var people = ['1', '2', '3'];
addMethod(people, 'finds', function() {
return 0;
})
addMethod(people, 'finds', function(firstname) {
return 1;
})
addMethod(people, 'finds', function(firstname, lastname) {
return 2;
})
console.log(people.finds('1', '2'))
console.log(people.finds());
console.log(people.finds('1'));
复制代码
people.find事实上只能绑定一个函数,那它为什么能够处理3种不一样的输入呢?它不可能同时绑定3个函数find0,find1与find2啊!这里的关键在于old属性。 由addMethod函数的调用顺序可知,users.find最终绑定的是find2函数。然而,在绑定find2时,old为find1;同理,绑定find1时,old为find0。3个函数find0,find1与find2就这样经过闭包连接起来了。 根据addMethod的逻辑,当fn.length与arguments.length不匹配时,就会去调用old,直到匹配为止。bash