JSのargmentsオブジェクト及びjsの重荷重を実現することについて
3896 ワード
このargunmentsについては、多くの学生が見たことがあると思いますが、あまり多く使われていないようです.多くの人が彼のことを知っています.今日はargmentの対象とどのような役割があるかについて話します.
何ですか argunments
JSにおいてはアーチェリーのような存在ですが、彼はアーチェリーと同じではありません.アーグメンントオブジェクトは明示的に作成できません.関数の開始時にのみ使用できます.アクセス配列のように各サブ要素にアクセスすることができます.
例えば、関数sayHi()において、最初のパラメータはメッセージである.argments[0]でもこの値にアクセスできます.すなわち、最初のパラメータの値(最初のパラメータは位置0にあり、2番目のパラメータは位置1にあり、これに類推します.)
したがって、名前のパラメータを明確にする必要はなく、関数を書き換えることができます.
また、argmentsオブジェクト検出関数のパラメータ個数を用いて、属性argments.lengthを参照すれば良い.
以下のコードは、各呼び出し関数で使用するパラメータの個数を出力します.
まずコードを見てみます.
アップグレード版を見てみましょう.
OKです.このaddMethod方法はもう実現しました.私達はこれからpeople.findの重負荷を実現します.すべてのコードは以下の通りです.
何ですか 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"]