動的言語に触れたことがない場合、コンパイル言語の考え方で JavaScript を理解することは魔法のように奇妙に感じられるでしょう。なぜなら、意識的に不可能なことが頻繁に起こり、学習している場合には不合理にさえ感じるからです。 JavaScript という自由で常に変化し続ける言語の過程でこの感覚に遭遇したなら、これからは「偏見」を捨ててください、ここは間違いなくあなたにとって新しい大陸なのですから、JavaScript に任せましょう
さて、本題に戻りましょう。まず、JavaScrtipt の動的変更ランタイム コンテキスト機能を理解してください。この機能は主に apply メソッドと call メソッドの使用に反映されます。
1. メソッドの定義
メソッドの呼び出し:
構文: call(thisObj, Object)定義: オブジェクトのメソッドを呼び出して、現在のオブジェクトを別のオブジェクトに置き換えます。
call メソッドを使用すると、別のオブジェクトに代わってメソッドを呼び出すことができます。 call メソッドは、関数のオブジェクト コンテキストを初期コンテキストから thisObj で指定された新しいオブジェクトに変更します。
thisObj パラメーターが指定されていない場合は、グローバル オブジェクトが thisObj として使用されます。
適用方法:
構文: apply(thisObj, [argArray])定義: オブジェクトのメソッドを適用して、現在のオブジェクトを別のオブジェクトに置き換えます。
説明:
argArray が有効な配列でない場合、または引数オブジェクトではない場合、TypeError が発生します。
argArray も thisObj も指定されていない場合は、Global オブジェクトが thisObj として使用され、パラメータを渡すことはできません。
注: call メソッドと apply メソッドは、apply がパラメーターを渡すために配列を使用することを除いて、まったく同じです。
function Animal(name) { this.name = name; this.showName = function() { console.log(this.name); }; } function Cat(name) { Animal.call(this, name); } Cat.prototype = new Animal(); function Dog(name) { Animal.apply(this, name); } Dog.prototype = new Animal(); var cat = new Cat("Black Cat"); //call必须是object var dog = new Dog(["Black Dog"]); //apply必须是array cat.showName(); dog.showName(); console.log(cat instanceof Animal); console.log(dog instanceof Animal);
function Animal(name) { this.name = name; this.showName = function() { alert(this.name); }; }; function Cat(name) { this.superClass = Animal; this.superClass(name); delete superClass; } var cat = new Cat("Black Cat"); cat.showName();
概要:
それぞれの定義:
apply: オブジェクトのメソッドを適用し、現在のオブジェクトを別のオブジェクトに置き換えます。call: オブジェクトのメソッドを呼び出して、現在のオブジェクトを別のオブジェクトに置き換えます。
彼らの共通点:
両方とも「別のオブジェクトの代わりにメソッドを呼び出すために使用でき、関数のオブジェクト コンテキストを初期コンテキストから thisObj で指定された新しいオブジェクトに変更できます。」 - JScript5.5.chm から抜粋
それらの違い:
apply: パラメータは最大 2 つだけです - 新しい this オブジェクトと配列 argArray です。このメソッドに複数のパラメーターが渡された場合、もちろん、パラメーターが 1 つしかない場合でも、すべてのパラメーターが配列に書き込まれます。 argArray が有効な配列でない場合、または引数オブジェクトではない場合、TypeError が発生します。 argArray も thisObj も指定されていない場合は、Global オブジェクトが thisObj として使用され、パラメータを渡すことはできません。call: これは直接パラメータ リストであり、主に、現在のこのインスタンス ポインタの一貫性を保つため、または特殊な状況下でこのポインタを変更するために、js オブジェクトのさまざまなメソッドが相互に呼び出すときに使用されます。 thisObj パラメーターが指定されていない場合は、グローバル オブジェクトが thisObj として使用されます。
より簡単に言うと、apply と call の関数は同じですが、渡されるパラメーター リストの形式が異なります。たとえば、対応する apply 書き込みメソッド func.call(func1,var1,var2, var3) は次のとおりです: func.apply(func1,[var1 ,var2,var3])