Hauptinhalt
Kurs: Programmierung > Lerneinheit 5
Lektion 4: Vektoren- Einführung in die Vektoren
- Challenge: Vektor-Walker
- Mehr Vektormathematik
- Challenge: Lichtschwert
- Größenordnung & Normalisierung von Vektoren
- Challenge: Grafische Darstellung des Betrags
- Vektorbewegung
- Challenge: Bremsendes Auto
- Statische Funktionen vs. Instanzmethoden
- Challenge: Statische Funktionen
- Interaktive Vektorbewegung
- Challenge: Mausverfolger
- Projekt: Computerkreaturen
© 2024 Khan AcademyNutzungsbedingungenDatenschutzerklärungCookie-Meldung
Statische Funktionen vs. Instanzmethoden
Bevor wir uns nun dem Algorithmus #3 (Beschleunigung in Richtung der Maus) zuwenden, müssen wir zuerst einen weiteren wichtigen Aspekt der Arbeit mit Vektoren und dem Objekt
PVektor
betrachten: dem Unterschied zwischen statischen Funktionen und Instanzmethoden.Vergiss für einen Moment die Vektoren und schau dir den folgenden Code an:
var x = 0;
var y = 5;
x = x + y;
Ziemlich einfach, nicht wahr?
x
hat den Wert 0, wir addieren y
und nun ist x
gleich 5. Den entsprechenden Code können wir ganz einfach auch mit PVector
schreiben.var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
Der Vektor v hat einen Wert von (0,0), wir addieren u und nun ist v gleich (4,5). Einfach, nicht wahr?
Nun betrachten wir noch ein anderes Beispiel einer einfachen Berechnung:
var x = 0;
var y = 5;
var z = x + y;
x
hat den Wert 0, wir addieren y
und speichern das Resultat in einer neuen Variable z
. In diesem Beispiel verändert sich der Wert weder von x
noch von y! Dies mag wie ein triviale Sache aussehen, etwas total intuitives wenn es sich um mathematische Operation mit Zahlen handelt. Mit mathematischen Operationen mit PVector
verhält es sich jedoch anders. Versuchen wir dies einmal basierend auf dem was wir schon kennen:var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // Lass dich nicht täuschen, dies ist falsch!!!
Der Code oben sieht zwar anfangs gut aus, aber leider verhält sich
PVector
nicht so Wenn wir uns die implementation von add
anschauen...PVector.prototype.add = function(v) {
this.x = this.x + v.x;
this.y = this.y + v.y;
};
...sehen wir, dass wir so unser Ziel nicht erreichen. Erstens erhalten wir keinen neuen
PVector
als Rückgabewert, da die Methode keine Anweisung return
hat. Zweitens wird der Wert des PVector
auf dem die Methode aufgerufen wurde verändert. Um zwei PVector
-Objekte zu addieren und das Resultat als neuen PVector
zurückzugeben, müssen wir die "statische" Funktion add()
aufrufen.Eine "statische" Funktion ist eine Funktion welche auf einem Objekt definiert wird, aber ihre Eigenschaften nicht verändert. Warum definieren wir dann überhaupt ein Objekt? Üblicherweise hat die Funktion schon etwas mit dem Objekt zu tun und daher macht es Sinn diese darauf zu implementieren. Das Objekt wird eher wie ein Namensraum verwendet. Zum Beispiel führen alle statischen Funktionen von
PVector
irgend eine Art von Manipulationen mit PVector
-Objekten die übergeben werden durch und geben eine Wert zurück. Dies Funktionen könnten auch global definiert werden, aber so können wir globale Funktionen vermeiden und haben den Code besser organisiert.Vergleichen wir. Die Instanzmethode
add
verwenden wir so:v.add(u);
Diese Codezeile würde aber
v
verändern und daher müssen wir keinen Rückgabewert speichern. Im Gegensatz dazu, verwenden wir die statische Funktion add()
so:var w = PVector.add(v, u);
Wenn wir das Resultat dieser Funktion nicht in einer Variable speichern würden, wäre die Zeile nutzlos, denn die statische Version verändert die Objekte nicht. Die statischen Funktionen von
PVector
erlauben uns generische mathematische Funktionen mit PVector
-Objekten durchzuführen, ohne das die Werte eines der PVector
en verändert werden.Die statische Version von
add()
wird so implementiert:PVector.add = function(v1, v2) {
var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
return v3;
};
Du wirst einige Unterschiede bemerkt haben:
- Wir defnieren die Funktion direkt auf dem Objekt und nicht auf seinem Prototyp
- In der Funktion wird das Schlüsselwort
this
nicht verwendet - Die Funktion hat einen Rückgabewert
Das PVector-Objekt hat statische Versionen von
add()
, sub()
, mult()
und div()
. Es hat ebenfalls statische Funktionen welche es gar nicht als Instanzmethoden gibt wie z.B. angleBetween()
, dot()
und cross()
. In unsere nächsten Programmen mit PVector
werden wir die meisten dieser Funktionen verwenden.Der Kurs "Natürliche Simulationen" ist eine Bearbeitung von "The Nature of Code" von Daniel Shiffman, und wird unter der Creative Commons Attribution-NonCommercial 3,0 Unported Lizenz verwendet.
Willst du an der Diskussion teilnehmen?
Noch keine Beiträge.