JavaScript学習点滴call、appyの違い
2790 ワード
1、コール
コールの方法
オブジェクトを別のオブジェクトに置き換える方法を呼び出します.
call([thisObj],arg 1[,arg 2[,argN]]]])
パラメータ
thisObj
オプションを選択します.現在のオブジェクトとして使用されます.
arg 1,arg 2,argN
オプションを選択します.転送される方法のパラメータ系列を指定します.
説明
コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.
thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.
単純な列(関数呼び出し):
継承を実現する
はい、そうです.これはjavaScriptがオブジェクトに向かう継承をどのようにシミュレートしているのか、多重継承も可能です.
多重継承
もちろん、jsの継承には他の方法があります.例えば、プロトタイプチェーンを使って、これは本文の範疇ではなく、ここでコールの使い方を説明します.
コールと言ったら、もちろんアプリもあります.この二つの方法は基本的に同じ意味です.
違いは、callの2番目のパラメータは任意のタイプであってもよいが、appyの2番目のパラメータは配列でなければならない.
2、appyはappyとcallの両方に対して作用は同じですが、両者はパラメータに違いがあります.
最初のパラメータについては同じ意味ですが、2番目のパラメータに対しては、
applyはパラメータ配列、つまり複数のパラメータを組み合わせて一つの配列にして入ってきます.callはcallのパラメータとして入ってきます.
func.call(func 1,var 1,var 2,var 3)に対応するappyの書き方は、func.apply(func 1,var 2,var 3)です.
テクニック(コードが優雅で、実行効率が高い)
コールの方法
オブジェクトを別のオブジェクトに置き換える方法を呼び出します.
call([thisObj],arg 1[,arg 2[,argN]]]])
パラメータ
thisObj
オプションを選択します.現在のオブジェクトとして使用されます.
arg 1,arg 2,argN
オプションを選択します.転送される方法のパラメータ系列を指定します.
説明
コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.
thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.
単純な列(関数呼び出し):
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
この例ではsub,add.call(sub,3,1)==add(3,1)をaddで置換するという意味ですので、実行結果は:alert(4)です.複雑な点の例(メソッドコール):
function Class1()
{
this.name = "class1";
this.showNam = function()
{
alert(this.name);
}
}
function Class2()
{
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showNam.call(c2);
なお、callとは、c 1の方法をc 2にセットして実行するという意味です.元々は、c 2はshowNam()の方法がないので、今はc 1のshowNam()の方法をc 2に置いて実行しています.だから、this.nameはclass 2であるべきです.実行の結果は、alert(clast 2);継承を実現する
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}
function Class2()
{
Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc");
これでクラス2はクラス1を継承します.クラス1.calとは、クラス1のオブジェクトをthisオブジェクトの代わりにするという意味です.クラス2の中にはクラス1の属性と方法が全部あるのではないですか?はい、そうです.これはjavaScriptがオブジェクトに向かう継承をどのようにシミュレートしているのか、多重継承も可能です.
多重継承
function Class10()
{
this.showSub = function(a,b)
{
alert(a-b);
}
}
function Class11()
{
this.showAdd = function(a,b)
{
alert(a+b);
}
}
function Class2()
{
Class10.call(this);
Class11.call(this);
}
簡単です.二つのcallを使って多重継承ができます.もちろん、jsの継承には他の方法があります.例えば、プロトタイプチェーンを使って、これは本文の範疇ではなく、ここでコールの使い方を説明します.
コールと言ったら、もちろんアプリもあります.この二つの方法は基本的に同じ意味です.
違いは、callの2番目のパラメータは任意のタイプであってもよいが、appyの2番目のパラメータは配列でなければならない.
2、appyはappyとcallの両方に対して作用は同じですが、両者はパラメータに違いがあります.
最初のパラメータについては同じ意味ですが、2番目のパラメータに対しては、
applyはパラメータ配列、つまり複数のパラメータを組み合わせて一つの配列にして入ってきます.callはcallのパラメータとして入ってきます.
func.call(func 1,var 1,var 2,var 3)に対応するappyの書き方は、func.apply(func 1,var 2,var 3)です.
テクニック(コードが優雅で、実行効率が高い)
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
var arr=[5,7,9,1]
alert(Math.max.apply(null,arr));