Перегрузка функции JavaScript - PullRequest
       2

Перегрузка функции JavaScript

1 голос
/ 06 октября 2010

Могу ли я сделать следующее?

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

В основном ... Я хочу иметь возможность вызвать contains() и передать ему либо объект Vertex, либо объект Edge, но я не хочу иметь дублирующийся код. Это правильный способ сделать это? Кроме того, правильно ли я выполняю задание var vertex = element / var edge = element? Я хочу присвоить element другому объекту Vertex / Edge и использовать его для поиска.

Дайте мне знать, если мне нужно уточнить.

Спасибо, Христо

Ответы [ 2 ]

3 голосов
/ 06 октября 2010

Ваш код должен работать нормально.

Заметьте, однако, что в написании var edge = element.
нет смысла (кроме ясности, что хорошо). Переменные Javascript не типизированы; нет никакой разницы между edge и element.

Кроме того, вам, вероятно, следует выдать исключение вместо

// shouldn't come here
return false;

Наконец, почему вы ищете self.verticies для Edge?

Кстати, обратите внимание, что у вас все еще есть повторяющийся код.
Вы можете переписать свою функцию так:

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 голосов
/ 06 октября 2010

Вот подход, который имеет пару преимуществ:

  1. Меньшие функции (не большие цепочки if / else if)
  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. и т.д.
...