JSのargmentsオブジェクト及びjsの重荷重を実現することについて


このargunmentsについては、多くの学生が見たことがあると思いますが、あまり多く使われていないようです.多くの人が彼のことを知っています.今日はargmentの対象とどのような役割があるかについて話します.
何ですか  argunments
 JSにおいてはアーチェリーのような存在ですが、彼はアーチェリーと同じではありません.アーグメンントオブジェクトは明示的に作成できません.関数の開始時にのみ使用できます.アクセス配列のように各サブ要素にアクセスすることができます.
例えば、関数sayHi()において、最初のパラメータはメッセージである.argments[0]でもこの値にアクセスできます.すなわち、最初のパラメータの値(最初のパラメータは位置0にあり、2番目のパラメータは位置1にあり、これに類推します.)
したがって、名前のパラメータを明確にする必要はなく、関数を書き換えることができます.
function sayHi() {
  if (arguments[0] == "bye") {
    return;
  }

  alert(arguments[0]);
}
検出パラメータの個数
また、argmentsオブジェクト検出関数のパラメータ個数を用いて、属性argments.lengthを参照すれば良い.
以下のコードは、各呼び出し関数で使用するパラメータの個数を出力します.
function howManyArgs() {
  alert(arguments.length);
}

howManyArgs("string", 45);//2
howManyArgs();//0
howManyArgs(12);//1
JSリロード
まずコードを見てみます.
function overLoading() {
  //   arguments.length,            
  switch(arguments.length) {
    case 0:
      /*  1       */
      break;
    case 1:
      /*  2       */
      break;
    case 2:
      /*  3       */
       
  //       case......
}
 
}
ここではjsの重負荷であり、argments属性length値を判断することにより、異なる操作について異なる判断を実行します.
アップグレード版を見てみましょう.
var people = {
  values: ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"]
};
 私たちはpeopleオブジェクトがfind方法を持つことを望んでいます.パラメータを伝えないと、people.valuesの中のすべての要素を返します.一つのパラメータを伝えると、first-nameとこのパラメータが一致する要素を返します.二つのパラメータを伝えると、first-nameとlast-nameが一致してやっと戻ってきます.find方法はパラメータの個数によって異なる動作を行うので、次のようにして、addMethodの方法がほしいです.
addMethod(people, "find", function() {}); /*   */
addMethod(people, "find", function(a) {}); /*   */
addMethod(people, "find", function(a, b) {}); /*   */
この時問題が来ました.この全体のaddMethod方法はどうやって実現しますか?John Resigsの実現方法は以下の通りです.コードは長くないですが、非常に巧妙です.
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);
    }
  }
}
このaddMethod関数を解析してみましょう.3つのパラメータを受信します.最初はバインディング方法のオブジェクトで、2番目はバインディング方法の名前で、3番目はバインディングが必要な方法(匿名関数)です.関数の分析はもう注釈の中にあります. 
    OKです.このaddMethod方法はもう実現しました.私達はこれからpeople.findの重負荷を実現します.すべてのコードは以下の通りです.
//addMethod
function addMethod(object, name, fn) {
  var old = object[name];
  object[name] = function() {
    if(fn.length === arguments.length) {
      return fn.apply(this, arguments);
    } 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"]