JavaScript中使用参数个数实现重载功能


Posted in Javascript onSeptember 01, 2017

利用参数的个数实现重载,马上想到的方法就是

function overload(){ 
    switch(arguments.length){ 
      case 0: 
        console.log("一个朋友都没有"); 
        break; 
      case 1: 
        console.log("有一个朋友"); 
        break; 
      case 2: 
        console.log("有两个朋友"); 
        break; 
      case 3: 
        console.log("有三个朋友"); 
        break; 
      case 4: 
        console.log("有四个朋友"); 
        break; 
      //等等 
    } 
  }

这种方式能实现重载,但是这样的代码比较长,实际开发中情况有时候会很多。所以我们可以用下面的方法。

window.onload=function (){ 
    var cat={ 
      friends:["mimi","pp","gg"] 
    } 
    addMethod(cat,"sayName",function(a,b){ 
      console.log("有两个朋友"); 
    }) 
    addMethod(cat,"sayName",function(){ 
      console.log("一个朋友都没有"); 
    }) 
    addMethod(cat,"sayName",function(a){ 
      console.log("有一个朋友"); 
    }) 
    addMethod(cat,"sayName",function(a,b,c){ 
      console.log("有三个朋友"); 
    }) 
    cat.sayName("xiaoming","nihao"); 
    cat.sayName(); 
    cat.sayName("xiaoming"); 
    cat.sayName("xiaoming","xiaohong"); 
  } 
  //实现重载,利用arguments.length的不同来实现 
  function addMethod(object,name,fn){ 
    var old=object[name]; 
    object[name]=function(){ 
      if(fn.length==arguments.length) 
        return fn.apply(this,arguments); 
      else if(typeof old=='function') 
        return old.apply(this,arguments); 
    } 
  }

这个技巧利用的是闭包,在闭包里作为引用进行存储的不同参数的情况。

实际调用addMethod函数的情况,如下图

JavaScript中使用参数个数实现重载功能

为什么会这样呢?

因为闭包的原因,在addMethod的函数中调用了object[name]字面量函数外部的变量old,这使得垃圾回收机制不会回收old,所以old会一直存在内存中,不会消失,我们就是利用的这个特性实现的继承。

下面执行sayName的时候,我们会沿着上边存储的引用依次查找相应的参数,然后找到对应函数来执行。

这种方法还是存在不足:

1.重载只适用于不同数量的参数,但不区分类型、参数或其他东西。

2.这个方法会有函数调用的开销,因为用到了闭包,会占用一些内存。在高性能应用的情况下不适合。

总结

以上所述是小编给大家介绍的JavaScript中使用参数个数实现重载功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 设计模式 富有表现力的Javascript(一)
May 26 Javascript
javascript之典型高阶函数应用介绍
Jan 10 Javascript
jquery ajax属性async(同步异步)示例
Nov 05 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
Oct 30 Javascript
JavaScript数据结构和算法之图和图算法
Feb 11 Javascript
JS实现的不规则TAB选项卡效果代码
Sep 18 Javascript
bootstrap导航、选项卡实现代码
Dec 28 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
jQuery第一次运行页面默认触发点击事件的实例
Jan 10 jQuery
js+html实现点名系统功能
Nov 05 Javascript
基于vue--key值的特殊用处详解
Jul 31 Javascript
javascript对象3个属性特征
Nov 17 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 #Javascript
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 #jQuery
基于Vue.js 2.0实现百度搜索框效果
Dec 28 #Javascript
JavaScript闭包的简单应用
Sep 01 #Javascript
写给vue新手们的vue渲染页面教程
Sep 01 #Javascript
深入理解Vue 的条件渲染和列表渲染
Sep 01 #Javascript
js禁止Backspace键使浏览器后退的实现方法
Sep 01 #Javascript
You might like
PHP url 加密解密函数代码
2011/08/26 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
YII中assets的使用示例
2014/07/31 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
Python的时间模块datetime详解
2017/04/17 Python
Python中property属性实例解析
2018/02/10 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
Python进行统计建模
2020/08/10 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
android面试问题与答案
2016/12/27 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
药学专业毕业生求职信
2013/10/20 职场文书
水毁工程实施方案
2014/04/01 职场文书
离职感谢信怎么写
2015/01/22 职场文书
大班下学期个人总结
2015/02/13 职场文书
公司员工离职感言
2015/08/03 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
使用Python拟合函数曲线
2022/04/14 Python