JavaScript関数の再負荷操作例を簡単に分析します。


本論文の実例はJavaScript関数の再負荷動作を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
先週の木曜日の午後、網易のビデオ面接を受けました。一時間以上会って、面接はとても悪いと思いました。たくさんの問題を聞きましたので、答えられませんでした。でも、その夜は、サプライズでHRから電話がありました。今HR面接の結果がまだ出ていません。来週の火曜日に出ると聞きました。
前にたくさんの無駄話をしましたが、今は仲間と面接の干物を分かち合う時間です。二面の質問の内容はまだ多いので、ここでは全部取り上げません。関数の再負荷についてのみここで議論します。
面接の時の会話です。「面」は面接官、「私」は私です。
面:JSはどのように関数の重積載を実現しますか?
私:JSのパラメータは可変長さなので、重積載はありません。重い荷物を使う必要もないです。
面:どうして重い荷物を使う必要がありますか?先に何が重積載ですか?
私:リロードとは、同じ名前と異なるパラメータリストの関数です。
えっと、どうしてJSは重積載していないと言っていますか?重積載も必要ないです。
私はその時ぼんやりした顔をしていました。面接官が何を試験したいのかは分かりませんでした。「JSプレミアムプログラム設計」では関数に重載がないと言っていたのを覚えています。重さがないと言い張ることができません。だから、私は荷重の概念の方向について静かにしばらく考えました。それから、アーグメンツを使って対象を判断することを思い出しました。そして:
私:JS関数が重負荷を実現する必要があるなら、argmentsオブジェクトのlength値によって判断できると思います。
面:例を書いて見せてもらえますか?
そして、入力ボックスに下記のコードを書きました。

function overLoading() {
  //   arguments.length,            
  switch(arguments.length) {
    case 0:
      /*  1       */
      break;
    case 1:
      /*  2       */
      break;
    case 2:
      /*  3       */
       
  //       case......
}
 
}

コードを面接官に送りました。
面:はい、これは積載の実現方法です。でも、もっといい方法を考え出せますか?
この方法を思いつきました。
はい、面接官との会話はこんなに多く書きました。彼は私にもっといい方法を考え出せないかと聞いています。他に知らない方法があるという意味です。それで、本をめくって探し始めました。ハッハッハッ、ついにJQueryの父のJohn Resigで書いた《secrets of the JavaScript ninja》は1つのとても巧みな方法を探し当てました!その方法はクローズドの特性を十分に利用しています。
この方法を紹介する前に、私達はまず外国人の名前の構成を見にきます。例えば、ジョン・Resigg、ジョンはfirst-name、Resiggはlast-nameで、私達の名前は苗字と名前で構成されています。
私たちは今このような需要があります。peopleの対象があります。中には人名がいくつかあります。以下の通りです。

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"]

はい、JS関数の重載を実現するには、こんなにたくさん書きました。もし親たちがより良い実現方法があれば、交流についてコメントしてください。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容に興味がある読者は、当駅のテーマを見ることができます。「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」および「JavaScript数学演算の使い方のまとめ
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。