JavaScript関数の再負荷操作例を簡単に分析します。
5693 ワード
本論文の実例はJavaScript関数の再負荷動作を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
先週の木曜日の午後、網易のビデオ面接を受けました。一時間以上会って、面接はとても悪いと思いました。たくさんの問題を聞きましたので、答えられませんでした。でも、その夜は、サプライズでHRから電話がありました。今HR面接の結果がまだ出ていません。来週の火曜日に出ると聞きました。
前にたくさんの無駄話をしましたが、今は仲間と面接の干物を分かち合う時間です。二面の質問の内容はまだ多いので、ここでは全部取り上げません。関数の再負荷についてのみここで議論します。
面接の時の会話です。「面」は面接官、「私」は私です。
面:JSはどのように関数の重積載を実現しますか?
私:JSのパラメータは可変長さなので、重積載はありません。重い荷物を使う必要もないです。
面:どうして重い荷物を使う必要がありますか?先に何が重積載ですか?
私:リロードとは、同じ名前と異なるパラメータリストの関数です。
えっと、どうしてJSは重積載していないと言っていますか?重積載も必要ないです。
私はその時ぼんやりした顔をしていました。面接官が何を試験したいのかは分かりませんでした。「JSプレミアムプログラム設計」では関数に重載がないと言っていたのを覚えています。重さがないと言い張ることができません。だから、私は荷重の概念の方向について静かにしばらく考えました。それから、アーグメンツを使って対象を判断することを思い出しました。そして:
私:JS関数が重負荷を実現する必要があるなら、argmentsオブジェクトのlength値によって判断できると思います。
面:例を書いて見せてもらえますか?
そして、入力ボックスに下記のコードを書きました。
面:はい、これは積載の実現方法です。でも、もっといい方法を考え出せますか?
この方法を思いつきました。
はい、面接官との会話はこんなに多く書きました。彼は私にもっといい方法を考え出せないかと聞いています。他に知らない方法があるという意味です。それで、本をめくって探し始めました。ハッハッハッ、ついにJQueryの父のJohn Resigで書いた《secrets of the JavaScript ninja》は1つのとても巧みな方法を探し当てました!その方法はクローズドの特性を十分に利用しています。
この方法を紹介する前に、私達はまず外国人の名前の構成を見にきます。例えば、ジョン・Resigg、ジョンはfirst-name、Resiggはlast-nameで、私達の名前は苗字と名前で構成されています。
私たちは今このような需要があります。peopleの対象があります。中には人名がいくつかあります。以下の通りです。
OKです。このaddMethod方法はもう実現しました。私達はこれからpeople.findの重負荷を実現します。すべてのコードは以下の通りです。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容に興味がある読者は、当駅のテーマを見ることができます。「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」および「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プログラムの設計に役に立ちます。