2010-10-06 5 views
1

Puis-je effectuer les opérations suivantes?javascript function surcharge

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

En gros ... Je veux être en mesure d'appeler et le transmettre soit un objet Vertex ou un objet Edge, mais je ne veux pas avoir le code en double. Est-ce que c'est la bonne façon de le faire? De plus, est-ce que je gère correctement la tâche var vertex = element/var edge = element? Je veux attribuer element à un autre objet Vertex/Edge et l'utiliser pour ma recherche. Faites-moi savoir si je dois clarifier.

Merci, Hristo

Répondre

3

Votre code devrait fonctionner correctement.

Notez, cependant, qu'il n'y a aucun point (autre que la clarté, ce qui est une bonne chose) en écriture var edge = element.
Les variables Javascript ne sont pas typées; il n'y a pas de différence entre edge et element.

En outre, vous devriez probablement jeter une exception au lieu de

// shouldn't come here 
return false; 

Enfin, pourquoi vous recherchez self.verticies pour un Edge?

Notez, en passant, que vous avez encore du code en double.
Vous pouvez réécrire votre fonction comme ceci:

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

Si pas être 'element.id' au lieu de' edge.id'? – casablanca

+0

@casablanca: Oui; merci d'avoir attrapé ça. – SLaks

+0

C'était une erreur de copier/coller. Désolé pour ça. Mais merci pour les suggestions. En outre, je ne savais pas que je peux jeter des erreurs JavaScript ... comment cela fonctionne dans un navigateur? Le navigateur affiche-t-il simplement une fenêtre contextuelle? +1 pour une excellente réponse :) – Hristo

0

est ici une approche qui a deux avantages:

  1. fonctions plus petites (pas grand if/else si la chaîne)
  2. produit un approprié erreur pour les fonctions manquantes sans aucun codage supplémentaire

Voir ce que vous pensez:

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' 

Il a quelques inconvénients aussi.

  1. Le message d'erreur est pas très instructif (pas bien pire que le comportement par défaut si)
  2. « pollue » Vous l'objet « fenêtre » ici un peu (il travaillerait mieux dans le cadre d'un objet)
  3. etc
Questions connexes