Schutz - Modifizieren von Prototype Eigenschaften

Sie können Eigenschaften vom Prototyp lesen als wären es Intanzeigenschaften. Jede Eigenschaft einer Instanz wird automatisch eine Klasseneigenschaft oder Prototypeneigenschaft verdecken, wenn der Name gleich ist. Allerdings mag Ihnen eventuell etwas aufgefallen sein. Wenn wir auf Eigenschaften des Prototyps zugreifen können wie auf Instanzeigenschaften, sollten wir diese auch modifizieren können, nicht wahr? Lassen Sie uns einen Kojoten erstellen. Der Kojote ist so dumm, dass er sich drei Beine abgerissen hat, aber immer noch in der Falle hängt. Er verliert immer nur ein Bein, das könnte ungefähr so aussehen:

Coyote = function( ){}
Coyote.prototype.legs = 4;

ralph = new Coyote( );
ralph.legs--;
ralph.legs--;
ralph.legs--;

Das könnte ein Problem sein. Erkennen Sie warum? (Der Kojote kann immer noch nicht weglaufen? Nein!) Die "legs" Eigenschaft ist in Coyote.prototype, nicht in der Instanz namens "ralph". Wenn wir also sagen "ralph.legs--", erwarten wir dass Coyote.prototype dekrementiert wird, und im Endeffekt, passiert das dort auch. Das würde ein großes Problem darstellen, wenn es mehrere Instanzen von Coyote gäbe, da alle Ihre "legs" Eigenschaft vom selben Prototypen erhalten. Nun, das ist ein grosser Nachteil von Prototypes. Haha, nur ein Scherz. In Wirklichkeit gibt es einen schönen Lösungsweg. Jedesmal, wenn eine Prototyp-Eigenschaft (legs) von einer Instanz modifiziert wird, wird sie zuerst in die Instanz kopiert und anschließend modifiziert. Das befreit Sie vom ständigen Buchführen, ob eine Instanz von einem Prototyp oder von der Instanz kommt. Wenn Sie also die Eigenschaft einer Instanz modifizieren, sagen Sie "diese Eigenschaft in dieser Instanz ist anders". So macht es also Sinn, dass die Modifikation nur in dieser Instanz passiert. Wenn man Werte von Eigenschaften ausliest besteht jedoch kein Bedarf, sie in der Instanz abzulegen, da sie für alle Instanzen derselben Klasse gleich ist.

 

Denken Sie an den Satz "John hat große Ohren" und "John hat Ohren". Im ersten Satz haben John's Ohren eine besondere Größe dass sie von normalen Ohren abhebt. Menthal verknüpfen wir diese Besonderheit also mit John. Wenn wir sagen "John hat Ohren", dann hat John Ohren wie jeder andere auch, also verbinden wir das Wort Ohren mit Menschen, Leute, nicht mit John. Sie können diesen Gedankensprung verfolgen indem Sie die Sätze kombinieren: "John hat Ohren, und diese sind sehr groß". Zuerst dachten Sie an Ohren von Menschen, kopiert auf John, und haben sie dann modifiziert auf grössere Ohren. Hoffentlich haben Sie das getan, vielleicht haben Sie aber auch selbst große Ohren und gingen stattdessen in die Offensive. Wie auch immer, der gesamte Vorgang könnte in Actionscript wie folgt aussehen:

Human= function( ){}
Human.prototype.ears = 4; // alle Humans bekommen Ohren
// Diese Eigenschaft wird früh im Leben gesetzt.

john = new Human( );
john.ears++; // Die Ohren werden auf die Instanz "john" kopiert und inkrementiert


In diesem Beispiel beginnen die Ohren im Prototyp und enden als Kopie in der Instanz (wobei das Original im Prototyp unberührt bleibt). Ihr Gehirn schützt Sie davor anzunehmen, dass alle Leute große Ohren haben nur weil Sie John kennengelernt haben, obwohl Ohren ein Attribut aller Menschen ist. Actionscript macht dasselbe automatisch für Sie. Was passiert, wenn Sie versehentlich eine Eigenschaft einer Instanz löschen, welche im Prototyp definiert wurde. Actionscript wird den Prototyp nicht verändern, solange Sie ihn nicht explizit angeben: delete Human.prototype.ears anstelle von delete john.ears. Die Dinge sind also sehr sicher mit Prototypen, Instanzen können sie nicht ändern solange sie es nicht ausdrücklich so wollen. Achja, John übrigens verlor kürzlich seine beiden Ohren und konnte immer noch keine Freundin finden ...

 






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