WEB开发网
开发学院网页设计JavaScript 让 JavaScript 轻松支持函数重载 (Part 2 - 实现)... 阅读

让 JavaScript 轻松支持函数重载 (Part 2 - 实现)

 2010-09-14 13:47:39 来源:WEB开发网   
核心提示: 我想这段代码相当容易理解,因此就不再解释了,让 JavaScript 轻松支持函数重载 (Part 2 - 实现)(2),我第一次写这段代码时忘记写上面的第一个if了,导致空白签名字符串""无法被正确识别为空白签名数组[],剩下匹配的签名个数不同处理方法也不同 0个匹配

我想这段代码相当容易理解,因此就不再解释了。我第一次写这段代码时忘记写上面的第一个if了,导致空白签名字符串""无法被正确识别为空白签名数组[],幸好我的unit test代码第一时间发现了这个缺陷。看来编写unit test代码还是十分重要的。

匹配函数签名

在我们得到函数签名的类型数组后,我们就可以用它和输入参数的实例数组做匹配了,以此找出正确的重载。在讨论具体如何匹配函数签名以前,我们先来看看C#或VB.NET这样的语言是如何处理函数重载匹配的。一般语言进行函数重载匹配的流程都是这样子的:

参数个数 - 参数个数不对的重载会被排除掉

参数类型 - 参数类型无法隐式转换为签名类型的会被排除掉

匹配个数 - 排除完毕后,剩下匹配的签名个数不同处理方法也不同

0个匹配 - 没有命中的匹配

1个匹配 - 这个就是命中的匹配

2个或以上的匹配 - 如果能在这些匹配中找出一个最佳匹配,那就命中最佳匹配;否则不命中任何匹配

在这一节里面,我们先处理流程中的前两个步骤,把参数个数或参数类型不一致的签名去掉:

var matchSignature = function(argumentsArray, signature) {
  if (argumentsArray.length < signature.length) {
    return false;
  } else if (argumentsArray.length > signature.length && !signature.more) {
    return false;
  }
  for (var i = 0; i < signature.length; i++) {
    if (!(signature[i] == Overload.Any
      || argumentsArray[i] instanceof signature[i]
      || argumentsArray[i].constructor == signature[i])) {
        return false;
    }
  }
  return true;
};

Tags:JavaScript 轻松 支持

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接