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