594 Kapitel 13
Eine Prototypenkette erstellen
Wir haben einen Hund-Prototyp
und Rudel Hunde, das von ihm
erbt.
Wir brauchen einen Prototyp
für Ausstellungshunde, der vom
Hund-Prototyp erbt.
species: "Hund"
Dog Prototype
bark()
run()
wag()
name: "Spot"
breed: "Chihuahua"
weight: 10
Dog
name: "Fluffy"
breed: "Poodle"
weight: 30
Dog
name: "Fido"
breed: "Mischling"
weight: 17
Dog
league: "Webville"
ShowDog Prototype
stack()
bait()
gait()
groom()
name: "Scotty"
breed:
"Scottish Terrier"
weight: 7.5
handler: "Cookie"
ShowDog
Und eine Ausstellungshunde-
Instanz, die vom Prototyp für
Ausstellungshunde erbt.
Hier wollen
wir hin.
Beim Erstellen des Hund-Prototyps mussten wir nichts tun, denn es gab bereits
ein leeres Objekt, das von der prototype-Eigenschaft des Dog-Konstruktors
bereitgestellt wurde. Das haben wir genommen und die Eigenschaften und
Methoden hinzugefügt, die unsere Hund-Instanzen erben sollten.
Beim Prototyp für Ausstellungshunde ist das leider nicht so einfach, weil hier ein
Prototyp-Objekt benötigt wird, das von einem anderen Prototyp (dem Hund-
Prototyp) erben soll. Hierfür müssen wir zuerst ein Objekt erzeugen, das vom
Hund-Prototyp erbt, und dann ein paar Dinge ausdrücklich von Hand verbin-
den. Im Moment haben wir einen Hund-Prototyp und ein paar Hund-Instanzen,
die von ihm erben. Wir brauchen zusätzlich einen Prototyp für Ausstellungshun-
de (der vom Hund-Prototyp erbt) und ein paar Ausstellungshunde-Instanzen, die
ihrerseits vom Prototyp für Ausstellungshunde erben.
Die Einrichtung erfolgt in mehreren Schritten. Also: einer nach dem anderen.
Den Prototyp für Ausstellungshunde erstellen
Sie sind hier 595
Prototypen verwenden
Zuerst brauchen wir ein Objekt, das vom
Hund-Prototyp erbt
Wie wir festgestellt haben, ist der Prototyp für Ausstellungshunde ein Objekt,
das vom Hund-Prototyp erbt. Aber wie erstellt man solch ein Objekt am besten?
Tatsächlich haben Sie das bei der Erstellung der verschiedenen Hund-Instanzen
schon ein paarmal gemacht. Wissen Sie noch? Das ging ungefähr so:
var aDog = new Dog();
Dieser Code erzeugt also ein Objekt, das vom Hund-Prototyp erbt. Das wissen
wir, weil wir unsere Hund-Objekte auf exakt die gleiche Weise erstellt haben. Nur
haben wir diesmal keine Argumente an den Konstruktor übergeben, denn die
Einzelheiten eines Hundes sind uns hier nicht so wichtig. Wir brauchen einfach
ein allgemeines Hund-Objekt, das vom Hund-Prototyp erbt.
Wir haben eine neue Hund-Instanz
erzeugt. Sie hat weder Name noch
Rasse oder Gewicht. Trotzdem wissen
wir, dass sie vom Hund-Prototyp erbt,
weil es sich um einen Hund handelt.
Eigentlich brauchen wir einen echten Prototyp für Ausstellungshunde. Dieser ist erst
einmal, wie unsere Hund-Instanzen, ein einfaches Objekt, das vom Hund-Prototyp erbt.
Dann wollen wir mal sehen, wie wir die leere Hund-Instanz benutzen können, um daraus
den Prototyp für Ausstellungshunde zu erzeugen.
Was mit den Konstruktorargumenten
passiert ist, sagen wir Ihnen gleich.
Um ein Objekt zu erstellen, das vom
Hund-Prototyp erbt, benutzen wir
einfach new mit dem Dog-Konstruktor.
species: "Hund"
Dog Prototype
bark()
run()
wag()
name: "Spot"
breed: "Chihuahua"
weight: 10
Dog
name: "Fluffy"
breed: "Poodle"
weight: 30
Dog
name: "Fido"
breed: "Mischling"
weight: 17
Dog
Dog
aDog
596 Kapitel 13
Ein Objekt als Prototyp verwenden
ShowDog.prototype = new Dog();
Nächster Schritt: eine Hund-Instanz in einen
Prototyp für Ausstellungshunde verwandeln
Die Hund-Instanz hätten wir. Aber wie erstellen wir daraus ein Prototyp-Objekt für Ausstellungshunde?
Hierfür weisen wir die Hund-Instanz der prototype-Eigenschaft unseres ShowDog-Konstruktors zu. Oh,
Entschuldigung. Wir haben ja noch gar keinen ShowDog-Konstruktor. Das wollen wir jetzt ändern:
function ShowDog(name, breed, weight, handler) {
this.name = name;
this.breed = breed;
this.weight = weight;
this.handler = handler;
}
Jetzt haben wir einen Konstruktor und können seiner prototype-Eigenschaft die neue
Hund-Instanz zuweisen.
Mal sehen, wie weit wir sind: Wir haben einen ShowDog-Konstruktor, mit dem wir Ausstellungshunde-
Instanzen erstellen können. Außerdem haben wir einen Prototyp für Ausstellungshunde, der seinerseits
eine Hund-Instanz ist.
Dementsprechend passen wir jetzt unser Objektdiagramm an, damit die Rollen der verschiedenen
Objekte korrekt abgebildet werden. Wir ändern die Beschriftung von »Dog« in »ShowDog Prototype«.
Vergessen Sie aber nicht, dass der Prototyp für Ausstellungshunde eine Instanz von Dog ist.
Nachdem wir einen Prototyp für Ausstellungshunde haben und das entsprechende Prototyp-Objekt
fertig ist, müssen wir ein paar Details hinzufügen. Wir werden uns den Konstruktor gleich noch ge-
nauer ansehen. Außerdem muss wir den Prototyp um ein paar Eigenschaften und Methoden ergän-
zen, damit die Ausstellungshunde das benötigte zusätzliche Verhalten bekommen.
Dieser Konstruktor übernimmt alle
Informationen, die wir für einen Hund
brauchen (Name, Rasse, Gewicht) und
um einen Ausstellungshund zu erzeugen
(einen Hundeführer).
Wir hätten hier auch unsere auf der vorigen Seite
erzeugte Hund-Instanz benutzen können. Stattdessen
überspringen wir die Variablenzuweisung und weisen den
neuen Hund direkt der prototype-Eigenschaft zu.
species: "Hund"
Dog Prototype
bark()
run()
wag()
Dog
species: "Hund"
Dog Prototype
bark()
run()
wag()
ShowDog Prototype
Wir ändern den Namen in
unserem Diagramm von Dog
zu ShowDog Prototype.

Get JavaScript-Programmierung von Kopf bis Fuß now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.