2010-10-06 61 views
1

我可以执行以下操作吗?JavaScript函数重载

function contains(element) { 

// if the element is a Vertex object, do this 
if (element instanceof Vertex) { 

    var vertex = element; 
    for (var index in self.verticies) { 
    if (self.verticies[index].id == vertex.id) { 
    return true; 
    } 
    } 
    return false; 
} 
// else if the element is an Edge object, do this 
else if (element instanceof Edge) { 

    var edge = element; 
    for (var index in self.verticies) { 
    if (self.verticies[index].id == edge.id) { 
    return true; 
    } 
    } 
    return false; 
} else { 
    // shouldn't come here 
    return false; 
} 
}; 

基本上...我希望能够调用,并将它传递一个顶点对象或边缘对象,但我不希望有重复的代码。这是做到这一点的正确方法吗?此外,我是否正确处理作业var vertex = element/var edge = element?我想将element分配给另一个Vertex/Edge对象,并将其用于查找。

让我知道我是否需要澄清。

感谢, 斯托伊奇

回答

3

您的代码应该很好地工作。

但是请注意,在书写var edge = element时没有意义(除了清晰度,这是件好事)。
JavaScript变量是无类型的; edgeelement之间没有区别。

此外,你应该抛出一个异常,而不是

// shouldn't come here 
return false; 

最后,你为什么要为Edge搜索self.verticies

请注意,顺便说一下,您仍然有重复的代码。
你可以重写你的函数是这样的:

function contains(element) { 
    var searchSet; 

    // if the element is a Vertex object, do this 
    if (element instanceof Vertex) 
     searchSet = self.verticies; 
    else if (element instanceof Edge) 
     searchSet = self.edges; 
    else 
     throw Error("Unexpected argument"); 

    for (var i = 0; i < searchSet.length; i++) { 
     if (searchSet[i].id == element.id) 
      return true; 
    } 
    return false; 
} 
+0

不是'element.id'而不是'edge.id'吗? – casablanca 2010-10-06 02:50:16

+0

@casablanca:是的;感谢捕捉。 – SLaks 2010-10-06 02:50:48

+0

这是一个复制/粘贴错误。对于那个很抱歉。但感谢您的建议。此外,我不知道我可以抛出错误的JavaScript ......这些工作如何在浏览器中工作?浏览器是否显示弹出式窗口? +1表示出色的响应:) – Hristo 2010-10-06 02:54:43

0

下面是有几个优点的方法:

  1. 更小的函数(没有大的if/else若链)
  2. 产生适当的没有任何额外编码的错误功能

看到你的想法:

function contains(element) { 
    window['contains_' + typeof element](element); 
}; 

contains_string = function(element) { 
    alert('string: ' + element); 
}; 

contains('hi!'); // produces alert 
contains(3); // error: 'undefined is not a function' 

它也有一些缺点。

  1. 错误消息不是非常信息(并不比虽然默认行为更糟)
  2. 你“污染”这里的“窗口”对象一点(它会更好地工作为对象的一部分)
  3. etc