Verwendung 1 (allgemeine Verwendung):
Der Ausdruck lautet: ein object.method.call (ein anderes Objekt), was bedeutet, dass das aktuelle Objekt durch ein anderes Objekt ersetzt und die Methode des aktuellen Objekts ausgeführt wird. Schauen wir uns zunächst das Beispiel an:
Kopieren Sie den Codecode wie folgt:
Funktion Class1(){
this.name = "class1";
this.showName = function(){
alarm(this.name);
}
}
Funktion Class2(){
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showName.call(c2);
c2.showName(); //Kann nicht ausgeführt werden
Wir haben zunächst zwei Funktionen definiert, nämlich Klasse1 und Klasse2. Der Hauptunterschied zwischen ihnen besteht darin, dass Klasse2 eine showName()-Methode mehr hat als Klasse1. Dann werden die Objekte c1 und c2 definiert, die Class1 und Class2 entsprechen. Zu diesem Zeitpunkt wissen wir eindeutig, dass c1 über die Methode showName() verfügt, c2 jedoch nicht. Aber ein Wunder geschah. Wenn wir c1.shoName.call(c2) ausführen, erscheint der Namenswert von c2, nämlich „class2“. Tatsächlich führen wir immer noch die Methoden von c1 aus, aber wir haben das Objekt c2 nur vorübergehend durch das Objekt c1 ersetzt. Nach der Ausführung sind sie immer noch dieselben wie bei ihrer Definition und c2 verfügt über keine weiteren Methoden. Um festzustellen, ob c2 über weitere Methoden verfügt, fügt das Beispiel die Zeile c2.showNmae(); hinzu. Sie kann nicht ausgeführt werden und der Browser meldet den Fehler Object #<Class2> has no method 'showName'.
Warum das tun? Wie bereits erwähnt, handelt es sich hierbei um eine temporäre Nutzungsmethode, wir nutzen sie lediglich zur effizienten Programmierung. Dies gilt jedoch nicht ohne Einschränkungen. Angenommen, c1 und c2 werden zur Darstellung des ersetzten Objekts und des Ersatzobjekts verwendet, und fun1 wird zur Darstellung der inhärenten Methode von c1 verwendet. 1. Wenn fun1 keine Parameter benötigt und keine lokalen Variablen in der übergeordneten Funktion verwendet, gibt es tatsächlich keinen Unterschied zwischen c1.fun1.call(c2) und c1.fun1(); 2. Wenn fun1 keine Parameter erfordert, aber Verwendet die übergeordneten Funktionsvariablen in, müssen die von fun1 verwendeten Variablen mit denselben Namen in den Funktionen von c1 und c2 generiert werden. 3. Wenn fun1 Parameter erfordert, muss das Formular als c1.fun1.call(c2) umgeschrieben werden , Parameter 1, Parameter 2, ... Parameter n), zu diesem Zeitpunkt muss der Variablenname in der Funktion, die c1 generiert, nicht denselben Namen haben wie der Variablenname in der Funktion, die c2 generiert, er muss nur übereinstimmen. Wenn wir call verwenden, weisen c2 und c1 tatsächlich oft große Ähnlichkeiten in Struktur und Funktion auf, sodass die oben genannten drei Punkte leicht zu vermeiden sind.
Verwendung zwei:
Wird während des Definitionsprozesses einer Funktion verwendet, in Form einer anderen vorhandenen Funktion.call(this), die alle Variablen und Methoden einer anderen vorhandenen Funktion in ihre eigene Funktion klonen kann, wodurch eine Funktion ähnlich der Vererbung erreicht wird. Schauen wir uns ein Beispiel an:
Kopieren Sie den Codecode wie folgt:
Funktion Tier(Name){
this.name = Name;
this.showName = function(){
alarm(this.name);
}
};
var animal = new Animal("small_animal");
animal.showName(); //alert("small_animal")
Funktion Katze(Name){
Animal.call(this, name);
};
//var Animal = null; //Kommentieren Sie es aus und probieren Sie es aus
var cat = new Cat("black_cat");
cat.showName(); //alert("black_cat")