Überblenden / Overriding

Nun haben wir ein Modell indem alle Hunde 4 Beine haben, manche Hunde haben "puffyHair". Wird unser Modell brechen, wenn der Hund "yeller" beim benutzen einer Säge sein Bein verliert? Wir wollen keine Änderung "Hund.prototype.beine = 3;" durchführen, weil dann alle anderen Hunde auch betroffen wären (ausser wir benutzen die Säge für alle Hunde, mhm ...). Wenn wir zurück zu unserem Modell mit den Zetteln und dem Glas gehen können wir den besten Platz finden, wir platzieren diesen tragischen Vorfall von "yeller" auf seinen fordersten Zettel. Genauso wie fido dort Informationen über seine Haarpracht gespeichert hat. Das ist logisch genug, da es nur eine Veränderung von "yeller" ist, nicht der ganzen Hunderasse. Aber was passiert, wenn wir yeller's Beine modifizieren, indem wir sagen:

yeller.beine = 3 ?

Würde das nicht einfach den Wert von Hund.prototype.beine auf 3 ändern? Glücklicherweise nicht. Actionscript lässt keine Instanz den Prototypen ändern, als Schutzmechanismus (mehr hierzu später). Man wird vor sich selbst geschützt. - Es ist nun wieder sicher, Besteck zu benutzen.

Aber halt ... Hat yeller jetzt nicht zwei "beine" Eigenschaften: eine in seiner Instanz und die andere im Prototypen? Lassen Sie uns wiederrum unser Glasmodell ansehen. Es gibt wirklich ein Papier mit "beine = 4" auf der Prototypebene, und eine mit "beine = 3" auf der Instanzebene. Nun das witzige an diesem Modell ist, dass wenn zwei Zettel denselben Eigenschaftsnamen enthalten, sie automatisch hintereinander liegen. Wenn nun also beide Zettel direkt hintereinander liegen - welchen sehen Sie ? Natürlich nur den ersten (bzw. jenen der Instanz), und natürlich enthält er den Wert "yeller.legs = 3". So sieht der Code hierfür aus:

Hund = function( ){}
Hund.prototype.beine = 4;

yeller = new Hund( );
yeller.beine = 3;

Das macht Sinn. "Hunde haben vier Beine, aber yeller hat drei Beine". - Diesen Vorgang nennt man Überblenden (Overriding). Wenn zwei Eigenschaften denselben Namen besitzen, wird immer die der Instanz naheliegenste Eigenschaft zurückgeliefert. Dasselbe Prinzip gilt ja auch für unser Glasmodell, wenn ein Papier ein anderes verdeckt, sehen Sie auch immer nur das vorderste. Wenn Sie natürlich das vorderste entferenen, wird das Papier dahinter wieder sichtbar. Passiert das auch mit dem Prototyp? Ist die ursprüngliche Eigenschaft immer noch dort? Ja, sie ist es. - Wir müssen nur die vorderste Eigenschaft löschen und können sie sehen:

trace( yeller.beine ); // 3 - von der Instanz
delete( yeller.beine );
trace( yeller.beine ); // 4 - vom Prototypen

In diesem Beispiel konnten Sie feststellen, dass yeller's persönliche Eigenschaft "beine" nur die Sicht auf die gleichnamige Eigenschaft aus dem Prototypen verdeckte.








Navigation
Einleitung · Objekte · Klassen · Instanzen · Lokal · Vererbung · Prototypen · Overriding · Overwrite · Protection · Argumente · Konstruktor · Methoden · __proto__ · arguments[] · callee · caller