アプリとコールの違いを簡単に理解します.
2970 ワード
JavaScriptの各Functionオブジェクトには、それぞれの方法と一つのcall方法があります.
apply:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.例えば、B.appy(A、argments);つまり、AオブジェクトにBオブジェクトを適用する方法です.
コール:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.例えば、B.cal(A、args 1、args 2);つまり、AオブジェクトがBオブジェクトを呼び出す方法です.
それらの共通点:
「他のオブジェクトの代わりに方法を呼び出すために使用できます.関数のオブジェクトコンテキストを初期のコンテキストからthisObjに指定された新しいオブジェクトに変更します.」
それらの違い:
apply:最大2つのパラメータしかありません.新しいthisオブジェクトと一つの配列argAray.この方法に複数のパラメータを渡すと、この配列にパラメータを書き込みます.もちろん、一つのパラメータだけでも、配列に書き込みます.argArayが有効な配列またはargmentsオブジェクトでない場合、Type Errorにつながる.argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない.
call:複数のパラメータを受け入れることができます.最初のパラメータはappyと同じです.後ろはパラメータリストです.この方法は、主にjsオブジェクトの各方法で呼び出したときに、現在のthisインスタンスポインタを一致させるために使用され、または特別な場合にはthisポインタを変更する必要がある.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.
実際には、applyとcallの機能は同じですが、入ってきたパラメータのリスト形式は違っています.
サンプルコード:
(1)基本的な使い方
猫は魚を食べ、犬は肉を食べ、ウルトラマンは怪獣ちゃんを殴る.
天狗が魚を食べたいです.
猫は魚を食べます.call(犬、魚)
犬は魚を食べました
天狗が魚とエビと肉を食べたいです.
猫が魚を食べます.apple(犬、魚、エビ、肉)
または猫が魚・call(犬、魚、エビ、肉)を食べます.
猫が精になりました.怪獣を打ちたいです.
ウルトラマン.小怪獣.call(猫、小怪獣)
このように覚えました.
/*apply() */
function.apply(thisObj[, argArray])
/*call() */
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
それぞれの定義:apply:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.例えば、B.appy(A、argments);つまり、AオブジェクトにBオブジェクトを適用する方法です.
コール:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.例えば、B.cal(A、args 1、args 2);つまり、AオブジェクトがBオブジェクトを呼び出す方法です.
それらの共通点:
「他のオブジェクトの代わりに方法を呼び出すために使用できます.関数のオブジェクトコンテキストを初期のコンテキストからthisObjに指定された新しいオブジェクトに変更します.」
それらの違い:
apply:最大2つのパラメータしかありません.新しいthisオブジェクトと一つの配列argAray.この方法に複数のパラメータを渡すと、この配列にパラメータを書き込みます.もちろん、一つのパラメータだけでも、配列に書き込みます.argArayが有効な配列またはargmentsオブジェクトでない場合、Type Errorにつながる.argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない.
call:複数のパラメータを受け入れることができます.最初のパラメータはappyと同じです.後ろはパラメータリストです.この方法は、主にjsオブジェクトの各方法で呼び出したときに、現在のthisインスタンスポインタを一致させるために使用され、または特別な場合にはthisポインタを変更する必要がある.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.
実際には、applyとcallの機能は同じですが、入ってきたパラメータのリスト形式は違っています.
サンプルコード:
(1)基本的な使い方
function add(a,b){
return a+b;
}
function sub(a,b){
return a-b;
}
var a1 = add.apply(sub,[4,2]); //sub add
var a2 = sub.apply(add,[4,2]);
alert(a1); //6
alert(a2); //2
/*call */
var a1 = add.call(sub,4,2);
(2)継承の実現function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.apply(this,[name]);
}
var cat = new Cat(" ");
cat.showName();
/*call */
Animal.call(this,name);
(3)複数引き継ぎfunction Class10(){
this.showSub = function(a,b){
alert(a - b);
}
}
function Class11(){
this.showAdd = function(a,b){
alert(a + b);
}
}
function Class12(){
Class10.apply(this);
Class11.apply(this);
// Class10.call(this);
//Class11.call(this);
}
var c2 = new Class12();
c2.showSub(3,1); //2
c2.showAdd(3,1); //4
滑らかな記憶:猫は魚を食べ、犬は肉を食べ、ウルトラマンは怪獣ちゃんを殴る.
天狗が魚を食べたいです.
猫は魚を食べます.call(犬、魚)
犬は魚を食べました
天狗が魚とエビと肉を食べたいです.
猫が魚を食べます.apple(犬、魚、エビ、肉)
または猫が魚・call(犬、魚、エビ、肉)を食べます.
猫が精になりました.怪獣を打ちたいです.
ウルトラマン.小怪獣.call(猫、小怪獣)
このように覚えました.