Im letzten Talk-Through haben wir gelernt, wie wir einen Objekttyp für unsere beiden Winston-ähnlichen Objekte erstellen
und diese dann mit den Konstruktoren initialisieren.
Nun muss ein Objekttyp nicht nur mit Eigenschaften verbunden sein.
Er kann auch mit Funktionalität verbunden werden. Denke an die Welt und all die Objekttypen in ihr
wie uns Menschen. Wir alle haben Größe und Alter, aber wir haben auch Dinge, die wir tun können, wie schlafen, essen und programmieren.
Und wir wollen diese Funktionen mit diesen Objekttypen assoziieren.
In diesem Programm, das genau gleich ist, wie wir beim letzten Mal aufgehört haben, haben wir hier eine Funktion,
drawWinston, die wir für beide Winston Objekte aufrufen. Wäre es nicht toll, wenn wir diese Funktion einfach
mit dem Objekttyp Winston verbinden könnten? Nun, das können wir, und es ist einfach zu machen.
Also schreiben wir unter unseren Konstruktor Winston - großes W - Punkt -prototyp
Der Prototyp, das ist ein neues Wort, das du wahrscheinlich noch nicht gesehen hast.
Der Prototyp ist diese Eigenschaft eines Objekts, an die wir Funktionen anhängen können
und das bedeutet, dass jedes Objekt, das eine Instanz dieses Objekts ist, dann diese Funktionen hat.
Wir können also sagen: "dot prototype" und dann "dot", und dann den Namen der Funktion, also sagen wir "draw,
equals, und dann können wir unseren drawWinston Code nehmen und ihn einfach
hierher verschieben. Was wir hier gemacht haben ist, dass wir eine Zeichenfunktion an unseren Winston Prototyp angehängt haben.
Und das bedeutet, dass wir in der Lage sein sollten, draw() für jedes Objekt vom Typ Winston aufzurufen
Wir sollten also in der Lage sein, draw() für winstonTeen oder winstonAdult aufzurufen.
Wenn wir eine Funktion wie diese haben, die wir auf ein Objekt anwenden können,
nennen wir das eigentlich eine "Methode", also hörst du mich jetzt vielleicht "Methode" sagen.
Sagen wir also, das ist "die Methode draw()". Okay.
So, jetzt löschen wir dies, und wir löschen das, und jetzt schauen wir, ob wir draw() aufrufen können?
winstonTeen.draw()
Ok. Wir haben einen Fehler, wir haben diese Fehlermeldung hier, sie sagt "winstObject ist nicht definiert"
Okay. Also, vorher haben wir dieses Argument an drawWinston übergeben, welches das Winston Objekt war
aber jetzt übergeben wir es nicht mehr. Ähm, also könnten wir dies ändern, um es zu übergeben
und dann, mal sehen, was würden wir hier übergeben? Wir müssten winstonTeen übergeben. Aha.
Das hat funktioniert, aber das scheint auch wirklich dumm zu sein. Ich rufe bereits draw auf dem Objekt selbst auf.
Ich sollte nicht auch noch das Objekt übergeben müssen. Das scheint überflüssig zu sein.
Und das stimmt, wir sollten das nicht tun müssen, also lass uns das hier löschen, und jetzt lass uns nachdenken.
Wenn wir innerhalb des Objekts sind, was könnten wir benutzen, um auf die Eigenschaften des Objekts zuzugreifen?
Nun, du siehst dir vielleicht unseren Konstruktor an und erinnerst dich an das spezielle Schlüsselwort "this" und denkst "ahh"
"Was, wenn wir dies einfach in this ändern!" Also ändern wir winstObject in "this".
Denn wir befinden uns gerade innerhalb des Objekts. Diese Funktion wird im Objekt ausgewertet
also bezieht sich das "this" auf das aktuelle Objekt.
Auf diese Weise können wir einfach "this" sagen und erhalten Zugriff auf alle Eigenschaften des aktuellen Objekts.
Und das funktioniert perfekt, siehst du? Ist das nicht cool?
Jetzt können wir also sagen winstonAdult.draw()
Tada! Und es wird auf die Eigenschaften von winstonAdult zugreifen, weil das das Objekt ist, für das es aufgerufen wird.
Das ist also das wirklich coole an dem Schlüsselwort "this", auch wenn es manchmal etwas verwirrend sein kann.
Alles klar, das war echt Cool, also lass uns eine weitere Methode hinzufügen. Okay, also, was könnte Winston noch tun?
Vielleicht wird er reden. Also machen wir eine Winston.prototype.talk, damit wir so viele Methoden an den Prototyp anhängen können, wie wir wollen.
Wir sagen also: "Ich bin Winston!"
Und dann sagen wir einfach this.x+20, und this.y+150.
Und dann, ist nichts passiert, aber das liegt natürlich daran, dass ich die Funktion noch nicht wirklich aufgerufen habe.
Also, lassen wir den Teenager sprechen, winstonTeen.talk(), er redet die ganze Zeit
Ich bin Winston, tada! Und dann winstonAdult.talk()
Tada! Alles klar, jetzt haben wir also diesen Winston Objekttyp, der folgende Eigenschaften hat: Nickname,
Age, x, y; und er hat Funktionalität: Verhaltensweisen, Methoden; die abhängig von den Eigenschaften unterschiedlich agieren
und wir können so viele Instanzen von Winstons erstellen, wie wir wollen und jede dieser Methoden darauf aufrufen.
Das ist doch ziemlich cool!