簡體   English   中英

使用不同參數的函數重載JavaScript

[英]Function overloading with different arguments JavaScript

我有一種稱為“ 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)
    }
}

我可以通過找出我通過typeOf在“ naam”中接收到的哪種變量然后采取相應的措施來解決此問題,但是我覺得這會導致代碼混亂。

我想做的是有2個功能:

  • er(類別,naam)
  • leer(類別,[naam])

其中帶有名稱數組的名稱(naam(荷蘭語)為復數)將在for循環中調用第一個。

這在JavaScript中可行嗎? 因為據我所知,沒有辦法告訴Javascript方法:“您只能接受這種類型的變量,而只能接受這種類型”

我知道在python中你可以做這樣的事情def functionName(categorie:str,naam:str)等。

JavaScript不支持基於參數類型的函數重載。
但是,正如@AlexK 建議的那樣 ,您可以修改函數以接受可變數量的參數:

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[0]categorie ,所以這開始在arguments[1]處尋找參數。 然后,傳遞給leer每一個naam將被推到陣列上。

您可以這樣調用函數:

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

現在,您可以修改函數以接受字符串或數組,而不是:

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']);

如果可以選擇ES2015:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM