If you're seeing this message, it means we're having trouble loading external resources on our website.

Wenn du hinter einem Webfilter bist, stelle sicher, dass die Domänen *. kastatic.org und *. kasandbox.org nicht blockiert sind.

Hauptinhalt

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 PVectoren 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.
Verstehst du Englisch? Klick hier, um weitere Diskussionen auf der englischen Khan Academy Seite zu sehen.