使用法 1 (一般的な使用法):
式は object.method.call(another object) で、現在のオブジェクトを別のオブジェクトに置き換えて、現在のオブジェクトのメソッドを実行することを意味します。まず例を見てみましょう。
次のようにコードをコピーします。
関数 Class1(){
this.name = "クラス1";
this.showName = function(){
アラート(この名前);
}
}
関数 Class2(){
this.name = "クラス2";
}
var c1 = 新しい Class1();
var c2 = 新しい Class2();
c1.showName.call(c2);
c2.showName(); //実行できません
まず、Class1 と Class2 という 2 つの関数をそれぞれ定義しました。これらの主な違いは、Class2 には Class1 よりも showName() メソッドが 1 つ多いことです。次に、Class1 と Class2 に対応するオブジェクト c1 と c2 が定義されています。この時点で、c1 には showName() メソッドがありますが、c2 には存在しないことが明確にわかります。しかし、奇跡が起こりました。c1.shoName.call(c2) を実行すると、c2 の名前の値が「class2」として表示されます。実際には、まだ c1 のメソッドを実行していますが、オブジェクト c2 をオブジェクト c1 に一時的に置き換えただけで、実行後も定義されたときと同じであり、c2 にはそれ以上のメソッドはありません。 c2 にさらにメソッドがあるかどうかを検出するために、この例では行 c2.showNmae(); を追加します。これは実行できず、ブラウザーはエラー「オブジェクト #<Class2> にはメソッド 'showName' がありません」を報告します。
なぜこれを行うのでしょうか?前述したように、これは一時的な使用方法であり、効率的なプログラミングのために使用するだけです。ただし、これには制限がないわけではありません。c1 と c2 が置換オブジェクトと置換オブジェクトを表すために使用され、fun1 が c1 の固有メソッドを表すために使用されるとします。 1. fun1 がパラメータを必要とせず、親関数でローカル変数を使用しない場合、実際には c1.fun1.call(c2) と c1.fun1() に違いはありません。 2. fun1 がパラメータを必要としない場合、で親関数の変数を使用する場合、c1 と c2 の関数内で同じ名前で fun1 によって使用される変数を生成する必要があります。 fun1 にパラメータが必要な場合、形式は c1.fun1.call(c2) として書き換える必要があります。 、パラメータ 1、パラメータ2、…パラメータn)、このとき、c1を生成する関数内の変数名は、c2を生成する関数内の変数名と同じである必要はなく、一致していればよい。実際、call を使用する場合、c2 と c1 は構造と機能が非常に似ていることが多いため、上記の 3 つの点は回避しやすいです。
使用法 2:
関数の定義プロセス中に次の形式で使用されます。別の既存の function.call(this) は、別の既存の関数のすべての変数とメソッドを独自の関数に複製し、継承と同様の関数を実現します。例を見てみましょう:
次のようにコードをコピーします。
関数 動物(名前){
this.name = 名前;
this.showName = function(){
アラート(この名前);
}
};
var Animal = 新しいAnimal("small_animal");
動物.showName(); //アラート("小さい動物")
関数 Cat(名前){
Animal.call(これ, 名前);
};
//var Animal = null //コメントを解除して試してください。
var cat = new Cat("black_cat");
cat.showName(); //alert("black_cat")