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

JavaScript的過載(通過argument.length)

偶然間在部落格園看到的關於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"]