まずは公式の説明を見てみましょう:
call メソッド
を参照してください
適用対象: 関数オブジェクト
必須
バージョン 5.5
オブジェクトのメソッドを呼び出して、現在のオブジェクトと別のオブジェクトオブジェクト。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
パラメータ
thisObj
オプション。現在のオブジェクトとして使用されるオブジェクト。
arg1、arg2、、、argN
オプション。一連のメソッドパラメータが渡されます。
説明
call メソッドを使用すると、別のオブジェクトの代わりにメソッドを呼び出すことができます。 call メソッドは、関数のオブジェクト コンテキストを初期コンテキストから thisObj で指定された新しいオブジェクトに変更します。
thisObj パラメーターが指定されていない場合は、グローバル オブジェクトが thisObj として使用されます。
一見すると混乱しやすいので、最初に簡単に説明します。
obj1.method1.call(obj2,argument1,argument2)
上記のように、call の機能はobj1 のメソッド obj2 で使用し、次の argument1.. をパラメータとして渡します。
具体的な例を示します
関数add(a ,b)
{
alert(a b);
関数 sub(a,b)
{
alert(a-b); add.call(sub,3,1);
この例では、sub を add に置き換えることを意味します、add.call(sub,3,1) == add(3,1) )、実行結果は次のようになります:alert(4); // 注: js の関数は実際にはオブジェクトであり、関数名は Function オブジェクトへの参照です。
もう少し複雑な例を見てください
{
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 は、c1 のメソッドを c2 に実行することを意味することに注意してください。 c1 の showNam() メソッドを配置することです。 ) メソッドは実行のために c2 に配置されるため、this.name は class2 になるはずで、実行結果は次のようになります。興味深いことに、オブジェクト a にオブジェクト b のメソッドを実行させることができます。これは Java プログラマが思いつかないことです。さらに興味深いのは、呼び出しを使用して継承を実装できることです。
コードをコピーします
alert(txt);
}
}
関数 Class2()
{
Class1.call(this);
var c2 = new Class2()
このように、Class2 は Class1 を継承します。Class1.call(this) は、このオブジェクトの代わりに Class1 オブジェクトを使用することを意味します。その場合、Class2 は Class1 のすべてのプロパティとメソッドを持たず、c2 オブジェクトは Class1 のメソッドとプロパティを直接呼び出すことができます。実行結果は次のとおりです:alert ("cc");
はい、これで JavaScript がオブジェクト指向で継承をシミュレートし、多重継承を実装することもできます。
コードをコピー
コードは次のとおりです。
}
function Class11()
{
this.showAdd = function(a ,b)
{
alert(a b);
}
}
function Class2()
{
Class10.call(this); Class11.call (this);
}
これは非常に簡単で、2 つの呼び出しを使用して多重継承を実現します
もちろん、プロトタイプ チェーンを使用するなど、js を継承する他の方法もあります。 、これは属しません この記事の範囲は、call の使用法を説明することだけです
call について言及しましたが、もちろんこれら 2 つのメソッドは基本的に同じことを意味します
違いは、call の 2 番目のパラメータであることです。 apply の場合は、任意の型を指定できます。2 番目のパラメータは配列である必要があります。または、引数
と callee、caller を指定することもできます。これについては、次回説明します。