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