JS函數(shù)的重載(多態(tài))

其它面向?qū)ο笳Z言如Java的一個常見特性是:能夠根據(jù)傳入的不同數(shù)量量或類型的參數(shù),通過“重載”函數(shù)來發(fā)揮不同的功用。但是這個特性在Javascript中并沒有被直接支持,可是有很多辦法實現(xiàn)這一功能。

< JS嚴格上沒有函數(shù)重載的,但是可以使用arguments和實參的類型進行模擬 >
arguments案例: 任意數(shù)求和

function sum() {
   var total = null;
   for (var i=0,len=arguments.length;i<len;i++) {
       var cur = Number(arguments[i]); 
       if (!isNaN(cur) {
           total += cur;
      }
  }
 return total;
};
 sum(1, 2, 3); //--->> 6
 sum(1, '10'); // --->> 11

核心:

  • 1 參數(shù)的個數(shù)( (arguments對象的使用)
  • 2 參數(shù)的類型 (typeof檢測數(shù)據(jù)類型的使用)

argument: 函數(shù)內(nèi)部的一個對象,用來接收函數(shù)執(zhí)行所傳入實參,他是一個類數(shù)組,有l(wèi)ength屬性,但是不能使用數(shù)組的方法, 只能在函數(shù)內(nèi)部使用.

function sum(x) {
    console.log(x);
}

function sum(x, y) {
    console.log(x+y);  //--->>3
}
sum(1);
sum(1, 2);
后面的函數(shù)覆蓋了前面的函數(shù),因為同一個變量,地址覆蓋了

1.依據(jù)函數(shù)實參的個數(shù)來進行模擬函數(shù)的重載

  var Add = function () {
  var len = arguments.length; //獲取函數(shù)實參的個數(shù)
  if (len === 0) {
      console.log('no-param');
      return this;
  } else if(len === 1) {
      console.log('one-param');
      return this;
  } else if(len ===2) {
      console.log('two-param');
      return this;
  } else {
      console.log('param > 2');
      return this;
  }
};

Add();
Add(1);
Add(1, 2);
Add(1, 2, 3);

2.依據(jù)形參的類型進行模擬函數(shù)的重載

   var Add = function () {
    if (typeof arguments[0] === 'number') {
        console.log('number-type-one-param');
    }

    if (typeof arguments[0] === 'string') {
        console.log('string-type-one-param');
    }
   };
   Add(10);
   Add('100');

3.倆種方式混合進行使用

    var Add = function () {
      if (arguments.length === 2 &&  typeof  arguments[0] === 'number') {
        console.log('prarm-2, first-parma-type-number');
     }

    if (arguments.length === 2 && typeof arguments[0] ==='string') {
        console.log('prarm-2, first-parma-type-string');
    }
};
Add(1 , 20);
Add('10' , 20);

4.案例,針對卡片進行增刪改查功能

   var Card = function (type, id) {
    var len = arguments.length,
        type = typeof arguments[0],
        value = arguments[0];
    if ((len===2) && (type === 'string') && (value === 'delete')) {
        console.log('delete-card');
        return false;
    }

    if ((len === 2) && (type === 'string') && (value === 'update')) {
        console.log('update-card');
        return false;
    }

    if ((len === 2) && (type === 'string') && (value === 'addCard')) {
        console.log('addCard-card');
        return false;
    }

    if ((len === 2) && (type === 'string') && (value === 'search')) {
        console.log('searchcard-card');
        return false;
    }
};
Card('addCard', '10012');
Card('delete', '10012');
Card('update', '10012');
Card('search', '10012');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容