2010-10-06 60 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