利用Arguments对象模拟函数重载的例子

js不支持函数重载,对于那么灵活的语言竟然不支持函数重载,是不可思议的,我觉得可能是js的函数参数是不用完全匹配的,在这种状况下,重载就太灵活了不好控制。

不过有了Arguments对象可以实现重载机制。

看下面例子:

 

<html>
<head>
 <title>Example-6.8 利用arguments实现的函数重载机制</title>
</head>
<body>
<script>
<!--
 function dwn(s)
 {
  document.write(s + "<br/>");
 }
 //$overload用来匹配参数类型和参数值,自动调用符合条件的重载函数
 function $overload(func, argMaps, owner)
 {
  //owner是函数的所有者,即调用对象,关于这部分的内容,在下一章中会有进一步的讨论
  owner = owner || null;
  var args = [];
  for(var i = 0; i < argMaps.length; i++)
  {
   //判断argMaps中存放的参数类型声明是否同实际的参数类型相匹配
   if(argMaps[i].type != typeof(argMaps[i].arg) && !(argMaps[i].arg instanceof argMaps[i].type))
    throw new Error("参数不匹配!"); //不匹配则抛出异常
   args.push(argMaps[i].arg); //否则将参数放入args数组准备调用
  }

  //用apply()实际调用该方法,关于apply()在本章稍后将有较详细的讨论
  return func.apply(owner, args); 
 }
 function Point(x, y)
 {
  this.x = x;
  this.y = y;
 }

 function Vector(x, y)
 {
  //私有方法,简单封装一个argMaps的结构
  function $t(type, arg)
  {
   return {
    type:type,
    arg:arg
   }
  }
  //用向量构造向量
  function vector_vector(v)
  {
   this.x = v.x;
   this.y = v.y;
  }
  //用点构造向量
  function point_vector(p)
  {
   this.x = p.x;
   this.y = p.y;
  }
  //用x,y坐标构造向量
  function number_number_vector(x, y)
  {
   this.x = x;
   this.y = y;
  }
  //用两个点所构成的线段构造向量
  function point_point_vector(p1, p2)
  {
   this.x = p2.x - p1.x;
   this.y = p2.y - p1.y;
  }
  //参数类型对应表,根据这个表指派正确的函数进行调用
  var funcs = [
   [number_number_vector,[$t("number",x), $t("number",y)]],
   [point_point_vector,[$t(Point,x), $t(Point, y)]],
   [vector_vector,[$t(Vector,x)]],
   [point_vector,[$t(Point,x)]]
  ];
  
  //如果不带参数调用,默认调用Vector(0,0);
  if (arguments.length == 0)
  {
   Vector.call(this, 0, 0);
  }

  for(var i = 0; i < funcs.length; i++)
  {
   try
   {
    //尝试选择合适的funcs进行调用
    return $overload(funcs[i][0],funcs[i][1], this);
   }
   catch(ex)
   {
   }
  }
  //如果参数类型和上面列表中的任何一个都不匹配,则抛出异常
  throw new Error("参数不匹配!");
 }
 //重载toString()方法,便于显示
 Vector.prototype.toString = function()
 {
  return "[" + this.x + "," + this.y + "]";
 }

 try
 {
  var v1 = new Vector(1,2); //用x,y形式构造Vector
  dwn(v1);
  var p1 = new Point(0,3);
  var p2 = new Point(2,4);
  var v2 = new Vector(p1); //用单点形式构造Vector
  var v3 = new Vector(p1, p2); //用两点确定的线段的形式构造Vector
  dwn(v2);
  dwn(v3);
  var v4 = new Vector("str"); //用字符串构造,类型都不匹配,抛出异常
 }
 catch(ex)
 {
  dwn(ex.message);
 } 
-->
</script>
</body>
</html>

 输出的是:[ 1,2 ]

                     [ 0,3 ]

                     [ 2,1 ]

                    参数不匹配

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值