<!--
关于 js 中的函数重载
1.在 《js高级程序设计》 中告诉我们,js不支持函数重载,那么如果出现函数明相同的情况下,后者会覆盖前者。
2.简单区别一下 函数重载 和 函数重写
函数重载:函数名相同,函数的参数不同 (包括参数的类型和个数)
函数重写:函数名,参数和返回值都相同
3.其实js中的函数重载还是很有必要的,接下来是两个实现函数重载的方法
4.函数主体中,arguments 的 length 属性指定了传递给该函数的实参的数目;而函数自身的 length 是只读属性,返回的是函数需要的实参数目
-->
<script>
function overLoading () {
switch(arguments.length) {
case 0:
// 不传参数的操作
break;
case 1:
// 一个参数的操作
break;
case 2:
// ...
}
}
// people 对象上有一个 find函数,
// 当没有传递参数的时候,返回 people.values 中的所有的值,
// 当传递一个参数的时候,返回firstName 跟这个参数匹配的value值
// 当传递两个参数的时候,返回firstName 和lastName 都匹配的value值
var people = {
values: ["Dean Edwards", "Alex Russell", "Dean Tom"]
}
addMethod(people, 'find', function () {})
addMethod(people, 'find', function(a) {})
addMethod(people, 'find', function(a, b) {})
function addMethod (object, name, fn) {
let old = object[name]
object[name] = function () {
if(arguments.length === fn.length) {
return fn.apply(this, arguments)
} else if(typeof old === 'function') {
return old.apply(this, arguments)
}
}
}
// 下面是通过 addMethod 来实现 people.find 的重载
addMethod(people, 'find', function(){
return this.values
})
addMethod(people, 'find', function(firstName) {
let ret = []
for(var i =0 ;i < this.values.length; i++) {
if(this.values[i].indexOf(firstName) === 0) {
ret.push(this.values[i])
}
}
return ret;
})
addMethod(people, 'find', function(firstName, lastName) {
let ret = []
for(var i =0 ;i < this.values.length; i++) {
if(this.values[i] === firstName + ' ' + lastName) {
ret.push(this.values[i])
}
}
return ret
})
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"]
</script>