其它面向对象语言如Java的一个常见特性是:能够根据传入的不同数量量或类型的参数,通过“重载”函数来发挥不同的功用。但是这个特性在Javascript中并没有被直接支持,可是有很多办法实现这一功能。

不管何种面向对象语,函数重载必须依赖两件事情,分别是:
1)判断传入参数数量的能力
2)判断传入参数类型的能力

第1件事情:Javascript判断传入参数数量

Javascript的每个函数都带有一个仅在这个函数范围内作用的变量——arguments,它是一个包含所有传给函数的参数的伪数组。为什么是伪数组?—— 你不能修改它,也不能用push来添加新元素等。但是你可以访问其中的元素,并且同时具有.length属性。有了length属性,我们就可以很方便的知道函数传入了几个参数。

function send( message, who ) {
if( arguments.length >= 2 ) {
console.log("你对" + who + "说:" + message);
}
else {
console.log("你对大家说:" + message);
}
}

第2件事情:Javascript判断传入的参数类型

如果我们在函数中并没有提供参数,那么message和who的值一定为'undefined'。我们可以使用typeof message = 'undefined'来判断是否传入了参数。

function send( message ) {
if( typeof message === 'undefined' ) {
console.log("ERROR:错误的信息内容");
}
else {
console.log("你说:" + message);
}
}

javascript中的类型检查我常常用两种方法来判断:

方法1:typeof 变量 == '类型名'。如下:

var x = 123;

typeof x == 'number' //true

x = '123';

typeof x == 'string' //true

但是,对于Array和Object对象,typeof之后的值是一样的,都为Object。即 typeof [] == type new Object(),如此当我们想要判断一个对象是否为数组或我们自定义的对象时,这种方法就显得有点不够好了。

方法2:利有构造函数来判断变量类型( 变量.constructor == 构造函数)

var num = 1, str = 'abcd', arr = [], obj = {}, tf = true, f = function(){};

用typeof对它们分别进行求值后,得到的结果分别是:number、string、 object、 object、 boolean、 function

如果分别调用它们的构造函 数,得到的结构分别是:Number、String、Array、Object、Boolean、Function

了解了上面两件事情(变量个数、变量类型)之后,我们就可以创造出属于自己的Javascript重载函数了。

本文只起抛砖引入的作用,具体如何利用,全靠个人发挥。

转载于:https://www.cnblogs.com/mrweb/archive/2013/02/01/2888366.html

浅谈Javascript中的函数重载实现相关推荐

  1. 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系

    转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...

  2. Javascript中的函数重载-最佳做法

    用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...

  3. html 滚动条 scrolltop scrollheight,浅谈JavaScript中scrollTop、scrollHeight、offsetTop、offsetHeight...

    浅谈JavaScript中scrollTop.scrollHeight.offsetTop.offsetHeight 发布时间:2020-07-17 09:27:20 来源:亿速云 阅读:223 作者 ...

  4. 浅谈C++中memset函数的用法

    浅谈C++中memset函数的用法 memset函数的头文件是cstring, 实际上是一个字符串处理函数,但常用于给静态数组(不是new出来的数组)赋特定初值. #include<cstrin ...

  5. python3打印如何换行_浅谈Python3中print函数的换行

    Python3中print函数的换行 最近看了看Python的应用,从入门级的九九乘法表开始,结果发现Python3.x和Python2.x真的是有太大的不同之处,就比如这里的换行处理,怕忘记先记下来 ...

  6. 浅谈JavaScript中的NaN

    浅谈JavaScript中的NaN NaN概念以及简单案例 追寻的纯粹该拥有自己的本质.-JC.F 什么是NaN? NaN:NaN(Not a Number),它表示不是数字,但是仍是数值类型. Na ...

  7. 浅谈JavaScript中的apply、call和bind

    摘要 三种方法均可改变函数this关键字的指向. apply()接受一参数数组,返回函数执行的结果. call()接受一组参数,返回函数执行的结果. bind()接受一组参数,返回函数体.需在bind ...

  8. JavaScript中实现函数重载和参数默认值

    2019独角兽企业重金招聘Python工程师标准>>> 参数默认值是指在调用函数时,若省略了某个实参,函数会自动为该参数分配一个默认值,使得函数调用的方便性和灵活性大大提高. 举个例 ...

  9. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

最新文章

  1. LeetCode 动态规划(Dynamic programming)系列题目--C++,Python解法
  2. 聊聊并发(七)——Java中的阻塞队列
  3. DHCP Client 无法启动 拒绝访问
  4. 《C语言点滴》一1.5 内功修炼
  5. mysql mysqli 修改_php mysqli 增删改查操作
  6. 《数据分析实战:基于EXCEL和SPSS系列工具的实践》一3.4 数据量太大了怎么办
  7. html select onchange 失效
  8. 已解决:mysql: [Warning] Using a password on the command line interface can be insecure.
  9. 19 个接私活平台汇总升级版,你有技术就有钱
  10. 数据库系统在计算机系统中的地位与作用,浅谈数据库设计在系统设计中的重要性...
  11. UGNX1957安装说明视频教程
  12. git push出现的问题与ssh相关
  13. 2020-12-01 剖析 Linux hypervisor
  14. 什么是大小端?如何测试某台机器是大端还是小端。
  15. 【导数术】1.导数基本公式
  16. 当前不会命中断点还未为文档加载任何符号——问题探究
  17. MySQL 远程连接报“ SQL 执行错误 # 1130.
  18. 【PyTorch实战】用RNN写诗
  19. CAD转PDF格式文件的5种技巧分享
  20. linux系统 git修改账号密码

热门文章

  1. htmlselect保留上次选择内容_中药口服液药液性质与过滤器械选择
  2. matlab安装配置vc出错,64位系统安装matlab出现mexopts.bat及出现缺少或无法安装c++ compilers 故障的解决办法.pdf...
  3. golang语言变量定义、打印、占位符
  4. php date.php 源码,date | php教程|php源码|php学习
  5. java 加密服务器_Javascript端加密java服务端解密
  6. 写论文,这个神器不能少!
  7. “晶振”拍了拍你,“你知道我是如何工作的吗?”
  8. 入门C语言20问20答
  9. HDLBits答案(5)_Generate实例化模块
  10. 基于FPGA多通道数据采集系统verilog设计