JavaScript函数重载
问题描述:
我可以执行以下操作吗?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对象,并将其用于查找。
让我知道我是否需要澄清。
感谢, 斯托伊奇
答
您的代码应该很好地工作。
但是请注意,在书写var edge = element
时没有意义(除了清晰度,这是件好事)。
JavaScript变量是无类型的; edge
和element
之间没有区别。
此外,你应该抛出一个异常,而不是
// 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;
}
答
下面是有几个优点的方法:
- 更小的函数(没有大的if/else若链)
- 产生适当的没有任何额外编码的错误功能
看到你的想法:
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'
它也有一些缺点。
- 错误消息不是非常信息(并不比虽然默认行为更糟)
- 你“污染”这里的“窗口”对象一点(它会更好地工作为对象的一部分)
- etc
不是'element.id'而不是'edge.id'吗? – casablanca 2010-10-06 02:50:16
@casablanca:是的;感谢捕捉。 – SLaks 2010-10-06 02:50:48
这是一个复制/粘贴错误。对于那个很抱歉。但感谢您的建议。此外,我不知道我可以抛出错误的JavaScript ......这些工作如何在浏览器中工作?浏览器是否显示弹出式窗口? +1表示出色的响应:) – Hristo 2010-10-06 02:54:43