zoukankan      html  css  js  c++  java
  • 妙用缓存调用链实现JS方法的重载

    来自于我的博客http://sweets.cf/,转载注明出处

    1.什么是方法重载

    方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
    简而言之就是:方法重载就是方法名称重复,加载参数不同。

    具体看请左转: 方法重载/百度百科
    那么js如何实现这个呢???

    2. js如何实现?

    首先javascript是没有重载函数/方法这个概念的,但是js提供了一个arguments这个方法参数,通过这个参数的length属性就可以拿到方法参数的长度,o对了,咱们今天实现的也仅仅是按照参数长度`重载`,而不是参数类型~·length ,
    那么及下载呢,一旦有了方法参数长度,于是出现了比常见的switch写法:

    var seven={
        dosomething:function(){
            switch(arguments.length){
                case 0:
                    console.log(arguments.length);
                    //dosomething
                    break;
                case 1:
                    console.log(arguments.length);
                    //dosomething
                    break;
                 case 2:
                    //dosomething
                    console.log(arguments.length);
                    break;
            }
        }
    }
    

    3.优化

    wow如果10个方法就需要10个分支而且很不好维护因为每个方法体都在case下,或者单独提出来写成一个function
    然后这些都是不好的不易维护的,逼格不够高的那么咱们应该如何优雅的实现对于不同参数的同一方法名的处理呢?
    这就用到这个 apply 这个方法了.
    咱们为seven编写一个addMethod方法

    var seven = {
        addMethod: function (fname, func) {
            var old = this[fname];
            this[fname] = function () {
                if (arguments.length == func.length) {
                    return func.apply(this,arguments);
                }
                if (typeof old == 'function') {
                    return old.apply(this, arguments);
                }
            }
        }
    };
    

    修改后的seven如上,然后之前写的switch就可以这样搞了:

    seven.addMethod('dosomething', function (x) {
        console.log(arguments.length);
          //dosomething
    });
    seven.addMethod('dosomething', function (x,y) {
        console.log(arguments.length);
          //dosomething
    });
    seven.addMethod('dosomething', function (x,y,z) {
        console.log(arguments.length);
          //dosomething
    });
    

    咱们要增加方法,只需要调用这个addMethod方法就ok了,是不是觉得简单明了,更加清晰。
    那么这段代码的原理呢,其实也很简单,就是缓存旧方法,然后根据参数长度依次apply链式调用,直到找到和当前参数等长的方法~然后进行调用。
    funcold 很有可能让初来乍到的童鞋们迷惑,其实不然,这里巧妙的使用了JavaScript语言的特性,这个old每一次保存的都是上一次方法的引用,
    而且每次都是全新的,而旧的old又保持着引用,这是什么呢?闭包喽~。

  • 相关阅读:
    Tree
    a letter and a number
    A problem is easy
    connect设置超时的方法
    C++客户端访问Java服务端发布的SOAP模式的WebService接口
    gSoap的“error LNK2001: 无法解析的外部符号 _namespaces”解决方法
    先序序列和后序序列并不能唯一确定二叉树
    二叉树的非递归遍历
    web service,soap ,http,tcp,udp
    byte[]数组和int之间的转换
  • 原文地址:https://www.cnblogs.com/seven007/p/6262805.html
Copyright © 2011-2022 走看看