Перегрузка функций в Javascript - лучшие практики - PullRequest
711 голосов
/ 19 января 2009

Как лучше всего подделать перегрузку функций в Javascript?

Я знаю, что невозможно перегрузить функции в Javascript, как в других языках. Если мне нужна была функция с двумя вариантами использования foo(x) и foo(x,y,z), которая является наилучшей / предпочтительной:

  1. Во-первых, используя разные имена
  2. Использование необязательных аргументов, таких как y = y || 'default'
  3. Использование количества аргументов
  4. Проверка типов аргументов
  5. или как?

Ответы [ 33 ]

0 голосов
/ 28 мая 2015

Мне нравится подход @ AntouanK. Я часто нахожу себя предлагающим функцию с разными числами параметров и разными типами. Иногда они не следуют порядку. Я использую для отображения карты типов параметров:

findUDPServers: function(socketProperties, success, error) {
    var fqnMap = [];

    fqnMap['undefined'] = fqnMap['function'] = function(success, error) {
        var socketProperties = {name:'HELLO_SERVER'};

        this.searchServers(socketProperties, success, error);
    };

    fqnMap['object'] = function(socketProperties, success, error) {
        var _socketProperties = _.merge({name:'HELLO_SERVER'}, socketProperties || {});

        this.searchServers(_socketProperties, success, error);
    };

    fqnMap[typeof arguments[0]].apply(this, arguments);
}
0 голосов
/ 07 февраля 2014

Так что мне очень понравился этот способ делать то, что я нашел в секретах ниндзя javascript

function addMethod(object,name,fn){
  var old = object[name];
  object[name] = function(){
    if (fn.length == arguments.length){
      return fn.apply(this,arguments);
    } else if(typeof old == 'function'){
        return old.apply(this,arguments);
    }
  }
}

Затем вы используете addMethod для добавления перегруженных функций к любому объекту. Основной путаницей в этом коде для меня было использование fn.length == arguments.length - это работает, потому что fn.length - это число ожидаемых параметров, а arguments.length - это количество параметров, которые фактически вызываются с помощью функция. Причина, по которой анонимная функция не имеет аргументов, заключается в том, что вы можете передать любое количество аргументов в javascript, и язык простителен.

Мне понравилось это, потому что вы можете использовать его везде - просто создайте эту функцию и просто используйте метод в любой кодовой базе, которую вы хотите.

Это также позволяет избежать смехотворно большого оператора if / switch, который становится трудным для чтения, если вы начнете писать сложный код (принятый ответ приведет к этому).

С точки зрения минусов, я думаю, код изначально немного неясен ... но я не уверен в других?

0 голосов
/ 15 декабря 2014

Я хотел бы поделиться полезным примером перегруженного подхода.

function Clear(control)
{
  var o = typeof control !== "undefined" ? control : document.body;
  var children = o.childNodes;
  while (o.childNodes.length > 0)
    o.removeChild(o.firstChild);
}

Использование: Очистить(); // очищает весь документ

Clear (myDiv); // Очищает панель, на которую ссылается myDiv

...