妙用缓存调用链实现JS方法的重载


Posted in Javascript onApril 30, 2018

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又保持着引用,这是什么呢?闭包喽~。

Javascript 相关文章推荐
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
jQuery实现的Div窗口震动特效
Jun 09 Javascript
由ReactJS的Hello world说开来
Jul 02 Javascript
浅析Javascript匿名函数与自执行函数
Feb 06 Javascript
Centos7 中 Node.js安装简单方法
Nov 02 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
解决vue.js this.$router.push无效的问题
Sep 03 Javascript
百度小程序自定义通用toast组件
Jul 17 Javascript
解决Vue router-link绑定事件不生效的问题
Jul 22 Javascript
vue移动端写的拖拽功能示例代码
Sep 09 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 Javascript
JS实现的缓冲运动效果示例
Apr 30 #Javascript
Vue波纹按钮组件制作
Apr 30 #Javascript
学习JS中的DOM节点以及操作
Apr 30 #Javascript
WebSocket的通信过程与实现方法详解
Apr 29 #Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 #jQuery
在vscode里使用.vue代码模板的方法
Apr 28 #Javascript
JS实现的透明度渐变动画效果示例
Apr 28 #Javascript
You might like
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
10个简化PHP开发的工具
2014/12/25 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
jQuery 动画基础教程
2008/12/25 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
java直接调用python脚本的例子
2014/02/16 Python
Python中endswith()函数的基本使用
2015/04/07 Python
解析Python中的二进制位运算符
2015/05/13 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
python实现flappy bird游戏
2018/12/24 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
Django如何批量创建Model
2020/09/01 Python
基于python实现复制文件并重命名
2020/09/16 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
应届生.NET方向面试题
2015/05/23 面试题
综合办公室主任职责
2013/12/16 职场文书
家长学校培训材料
2014/08/20 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技