1. 程式人生 > >JavaScript的重載(通過argument.length)

JavaScript的重載(通過argument.length)

ast eth -name 博客 入參 變量 log 這一 方法

偶然間在博客園看到的關於js的重載(重載就是一組具有相同名字、不同參數列表,實現不同操作的函數或方法)問題,作為初學者,在看紅寶書的時候,記得書中有概念說明js是沒有重載的

所以,覺得有必要把這一段 記錄下來

1)用於理解,使用argument.length判斷傳入參數的個數

function Function() {
  // 根據arguments.length,對傳入參數的個數進行判斷
  switch(arguments.length) {
    case 0:
    {  /*操作1*/
      break;   }  
    case 1:
    {  /*操作2*/
      break;   } 
    case 2:
    { /*操作3*/
          break;   }
   }
} 

2)實際使用的寫法(不得不說,很精妙)

//通過addMethod來實現對people.find方法的重載
function addMethod(object, name, fn) {
  var old = object[name]; //把前一次添加的方法存在一個臨時變量old裏面
  object[name] = function() { // 重寫了object[name]的方法
    // 如果調用object[name]方法時,傳入的參數個數跟預期的一致,則直接調用
    if(fn.length === arguments.length) {
      return fn.apply(this, arguments);
    // 否則,判斷old是否是函數,如果是,就調用old
    } else if(typeof old === "function") {
      return old.apply(this, arguments);
    }
  }
}
 
var people = {
  values: ["Dean Edwards", "Alex Russell", "Dean Tom"]
};
 
/* 下面開始通過addMethod來實現對people.find方法的重載 */
 
// 不傳參數時,返回peopld.values裏面的所有元素
addMethod(people, "find", function() {
  return this.values;
});
 
// 傳一個參數時,按first-name的匹配進行返回
addMethod(people, "find", function(firstName) {
  var ret = [];
  for(var i = 0; i < this.values.length; i++) {
    if(this.values[i].indexOf(firstName) === 0) {
      ret.push(this.values[i]);
    }
  }
  return ret;
});
 
// 傳兩個參數時,返回first-name和last-name都匹配的元素
addMethod(people, "find", function(firstName, lastName) {
  var ret = [];
  for(var i = 0; i < this.values.length; i++) {
    if(this.values[i] === (firstName + " " + lastName)) {
      ret.push(this.values[i]);
    }
  }
  return ret;
});
 
// 測試:
console.log(people.find()); //["Dean Edwards", "Alex Russell", "Dean Tom"]
console.log(people.find("Dean")); //["Dean Edwards", "Dean Tom"]
console.log(people.find("Dean Edwards")); //["Dean Edwards"]

  

JavaScript的重載(通過argument.length)