1.
call メソッドを呼び出す
オブジェクトのメソッドを呼び出して、現在のオブジェクトを別のオブジェクトに置き換えます。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
パラメータ
thisObj
オプション。現在のオブジェクトとして使用されるオブジェクト。
arg1、arg2、、、argN
オプション。一連のメソッドパラメータが渡されます。
説明
call メソッドを使用すると、別のオブジェクトの代わりにメソッドを呼び出すことができます。 call メソッドは、関数のオブジェクト コンテキストを初期コンテキストから thisObj で指定された新しいオブジェクトに変更します。
thisObj パラメーターが指定されていない場合は、グローバル オブジェクトが thisObj として使用されます。
簡単な例 (関数呼び出し):
function 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 ); より複雑な例 (メソッド呼び出し):
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);
呼び出しは、c1 のメソッドを実行のために c2 に置くことを意味することに注意してください。c2 には showNam() メソッドがありません。 c1 のメソッドを c2 に移動して実行するため、this.name は class2 になるはずで、実行結果は次のようになります。 ) は、Class1 オブジェクトを使用することを意味します。このオブジェクトの代わりに、Class2 には Class1 のすべてのプロパティとメソッドが含まれるのではないでしょうか? c2 オブジェクトは、Class1 のメソッドとプロパティを直接呼び出すことができます。 実行結果は次のようになります。
はい、以上です。これは、JavaScript がオブジェクト指向で継承をシミュレートし、多重継承を実装する方法です。
多重継承
function Class1() { this.showTxt = function(txt) { alert(txt); } } function Class2() { Class1.call(this); } var c2 = new Class2(); c2.showTxt("cc");
2. apply
の場合、Applyとcallは同じ機能ですが、パラメータが異なります。
最初のパラメータの意味は同じですが、2 番目のパラメータの場合:
apply はパラメータ配列を渡します。つまり、複数のパラメータが 1 つの配列に結合されて渡されますが、call は call のパラメータとして渡されます ( 2 番目のパラメータから開始します)。
たとえば、func.call(func1,var1,var2,var3) の対応する apply 書き込みメソッドは次のとおりです: func.apply(func1,[var1,var2,var3])
ヒント (コードはエレガントで実行効率も高い)は高いです)
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); }