利用arguments实现函数重载机制的例子

模拟函数重载,就是判断不同的实参调用函数里不同的代码段,用if...else的代码段实现。但这样做不是真正的实现函数重载,只能叫模拟,因为这样增加了函数的复杂度,而且和java实现的函数重载有很大的不同。

下面这个例子就可以说实现了函数重载,运用起来和java差不多。

<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>

 这段代码我还有很多不明白的地方,等我搞清楚了,再添加多一点注释。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值