函数重载使用不同的参数JavaScript

时间:2015-08-18 14:00:21

标签: javascript function overloading

我有这种名为“leer' (用英语学习)atm有2个单词。 1表示类别,1表示该类别。现在我想添加一些功能,我可以在一个类别中添加一堆单词。

WoordenSchat.prototype.leer = function(categorie,naam){
    if (!this.hasOwnProperty(categorie)){
        this[categorie] = []
        this[categorie].push(naam)
    }
    else {
        this[categorie].push(naam)
    }
}

我可以通过弄清楚我在naam'中收到的变量来解决这个问题。通过typeOf,然后相应地采取行动,但我觉得这会导致一段混乱的代码。

我想做的是有两个功能:

  • leer(categorie,naam)
  • leer(categorie,[naam])

其中一个名称数组(naam(荷兰语)复数形式)将在for循环中调用第一个名称。

这在JavaScript中可行吗?因为据我所知,没有办法告诉Javascript方法:"你只接受这种类型的变量和#34;

我知道在python中你可以做这样的def functionName(categorie:str,naam:str)等。

2 个答案:

答案 0 :(得分:2)

JavaScript不支持基于参数类型的函数重载 但是,作为@AlexK suggested可以修改函数以接受可变数量的参数:

WoordenSchat.prototype.leer = function(categorie){
    if (!this.hasOwnProperty(categorie)){   // We only need to do this check once.
        this[categorie] = [];
    } 
    for(var i = 1; i < arguments.length; i++){
        this[categorie].push(arguments[i]); // `arguments[i]` is the current `naam`.
    }
};

这开始在arguments[1]处查找参数,因为arguments[0]categorie。然后,传递给naam的每个leer都将被推送到数组上。

你可以这样调用这个函数:

myWoordenSchat.leer('programmeren', 'functies', 'variabelen', 'constanten');

您可以根据需要在categorie之后添加任意数量的参数。

这个功能可以简化一点:

WoordenSchat.prototype.leer = function(categorie){
    this[categorie] = this[categorie] || []; // Make sure `this[categorie]` exists
    for(var i = 1; i < arguments.length; i++){
        this[categorie].push(arguments[i]);  // `arguments[i]` is the current `naam`.
    }
};

现在,您可以修改函数以接受stings或数组,而不是:

WoordenSchat.prototype.leer = function(categorie, namen){
    this[categorie] = this[categorie] || [];

    if(typeof namen === 'string'){   // The first parameter after `categorie` is a string
        namen = arguments.splice(1); // So, get all parameters after `categorie` as array
    }

    for(var i = 0; i < namen.length; i++){
        this[categorie].push(namen[i]);
    }
};

因此,如果categorie之后的第一个参数是一个字符串,则迭代所有参数,否则,迭代namen数组。

您应该能够像这样调用函数:

myWoordenSchat.leer('programmeren', 'functies');
myWoordenSchat.leer('programmeren', 'functies', 'variabelen', 'constanten');
myWoordenSchat.leer('programmeren', ['functies', 'variabelen', 'constanten']);

答案 1 :(得分:0)

如果ES2015是一个选项:

WoordenSchat.prototype.leer = function(categorie, ...namen) {
  if (! this.hasOwnProperty(categorie)) {
    this[categorie] = [];
  }
  this[categorie].push(...namen);
}