[JS]JavaScriptのapplyとcallの用法の意味と違いについて(転)
3745 ワード
javascriptには
メソッドの定義 call方法:シンタックス:call([thisObj],arg 1[,arg 2]])定義:オブジェクトを呼び出す一つの方法で、現在のオブジェクトを別のオブジェクトに置き換える.説明:コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される. appy方法:構文:appy([thisObj],argAray])定義:あるオブジェクトを適用する方法で、現在のオブジェクトを別のオブジェクトに置き換える.説明:もしargArayが有効な配列ではないか、またはargmentsオブジェクトではないなら、TypeErrorを引き起こすことになります.argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない. ホワイトポイントとは、オブジェクトの内部ポインタを変更すること、すなわちオブジェクトを変更する と表記されています.は、 に入ることができる.
よくある実例
継承を実現する用法
参照
call
とapply
の方法があります.その役割は基本的に同じですが、少し違いがあります.まず、JSマニュアルのcall
とapply
の解釈を見てみよう.メソッドの定義
this
の指す内容である.これはオブジェクト指向のjsプログラミングの過程で時々有用である.ネット上のコードの部分を引用して、運行後自然にその道理が分かります.
function Obj(){this.value=" !";}
var value="global ";
function Fun1(){alert(this.value);}
window.Fun1(); //global
Fun1.call(window); //global
Fun1.call(document.getElementById('myText')); //input text
Fun1.call(new Obj()); // !
call
関数およびapply
方法の最初のパラメータは、現在のオブジェクトに導入されるべきオブジェクトおよび関数内部のthis
である.後ろのパラメータは現在のオブジェクトに渡すパラメータです.次のコードを実行します.
var func=new function(){this.a="func"}
var myfunc=function(x){
var a="myfunc";
alert(this.a);
alert(x);
}
myfunc.call(func,"var");
それぞれfunc
およびvar
がイジェクトされていることがわかる.ここでは、call
の各パラメータの意味が分かります.apply
およびcall
の両方については、機能的には同じであるが、両者はパラメータ的に異なる.第1のパラメータの意味は同じであるが、第2のパラメータ:apply
から入ってきたのは1つのパラメータ配列であり、つまり複数のパラメータを1つの配列にして入ってきたが、call
はcall
のパラメータとして入ってきた(第2のパラメータから開始した).如きfunc.call(func1,var1,var2,var3)
に対応するappyは、func.apply(func1,[var1,var2,var3])
apply
を使用する利点として、現在の関数のarguments
オブジェクトをapply
の第2のパラメータとして直接によくある実例
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);/注意:jsの関数はオブジェクトであり、関数名はFunctionオブジェクトへの参照です.function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
// call apply , Animal showName() cat 。
// "Cat"
animal.showName.call(cat,",");
//animal.showName.apply(cat,[]);
callとはanimalの方法をcatに置いて実行するという意味です.元々はcatはshowNameの方法がないので、今はanimalのshowNameの方法をcatに置いて実行します.だから、this.nameはCatであるべきです.継承を実現する用法
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.call(this, name);
}
var cat = new Cat("Black Cat");
cat.showName();
アニマル.callとは、アニマルオブジェクトをthisオブジェクトの代わりに使用するという意味で、アニマルのすべての属性と方法がCatにあるのではないでしょうか?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を使って多重継承を実現しました.参照