js 中的函数重载实现

<!-- 
        关于 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>

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值