Versionen vergleichen

Feinheiten des Objektmodells

Version 440231:

Version 440231 von eminor am

Version 440503:

Version 440503 von eminor am

Titel:
Feinheiten des Objektmodells
Feinheiten des Objektmodells
Adressname:
JavaScript/Guide/Feinheiten_des_Objektmodells
JavaScript/Guide/Feinheiten_des_Objektmodells
Inhalt:

Version 440231
Version 440503
n11      Für dieses Kapitel wird angenommen, dass der Leser bereits n11      Für dieses Kapitel wird angenommen, dass der Leser bereits 
>ein wenig Erfahrung mit JavaScript gesammelt und JavaScript-Funkt>ein wenig Erfahrung mit JavaScript gesammelt und JavaScript-Funkt
>ionen benutzt hat, um einfache Objekte zu erzeugen.>ionen benutzt hat, um einfache Objekte zu erstellen.
n17      Klassenbasierte objektorientierte Sprachenwie etwa Java on17      Klassenbasierte objektorientierte Sprachen (wie Java oder C
>der C++, setzen auf ein Konzept mit zwei verschiedene Einheiten: >++) setzen auf ein Konzept mit zwei verschiedene Einheiten: Klass
>Klassen und Instanzen.>en und Instanzen.
n20      <li>Eine Klasse definiert alle Eigenschaften (Methoden und n20      <li>Eine Klasse definiert alle Eigenschaften (Methoden und 
>Felder bei Java oder Members bei C++), die einen bestimmten Satz >Felder bei Java oder Members bei C++), die einen bestimmten Satz 
>von Objekten charakterisieren. Eine Klasse ist ein abstraktes Din>von Objekten charakterisieren. Eine Klasse ist ein abstraktes Din
>g, eine Art Bauplan für ein Objekt, und keines der Objekte selbst>g, eine Art Bauplan für ein Objekt, und keines der Objekte selbst
>. Zum Beispiel repräsentiert die Klasse <code>Mitarbeiter</code> >. Zum Beispiel repräsentiert die Klasse <code>Employee</code> den
>den ganzen Satz der Mitarbeiter.> ganzen Satz von Mitarbeitern.
n22      <li>Eine Instanz hingegen ist eine Instanzierung der Klassen22      <li>Eine Instanz hingegen ist eine Instanzierung der Klasse
>, also ein Member der Klasse. Zum Beispiel könnte <code>Viktoria<>, also ein Member der Klasse. Zum Beispiel könnte <code>Viktoria<
>/code> eine Instanz der Klasse <code>Mitarbeiter</code> sein und >/code> eine Instanz der Klasse <code>Employee</code> sein und ein
>eine Mitarbeiterin eines Unternehmens repräsentieren. Eine Instan>Mitarbeiterin eines Unternehmens repräsentieren. Eine Instanz h
>z hat genau die Eigenschaften der Elternklasse (nicht mehr und ni>at genau die Eigenschaften der Elternklasse (nicht mehr und nicht
>cht weniger).> weniger).
n26      Eine prototypbasierte Sprache wie JavaScript macht diese Unn26      Eine prototypenbasierte Sprache wie JavaScript macht diese 
>terscheidung nicht: Es gibt einfach nur Objekte. Bei einer protot>Unterscheidung nicht: Es gibt einfach nur Objekte. Bei einer prot
>ypbasierten Sprache gibt es prototypische Objekte, die schon best>otypenbasierten Sprache gibt es prototypische Objekte, die vordef
>immte Eigenschaften besitzen und als Vorlage für neue Objekte die>inierte Eigenschaften besitzen und als Vorlage für neue Objekte d
>nen. Zusätzlich kann jedes Objekt auch eigene Eigenschaften besit>ienen. Darüber hinaus kann jedes Objekt eigene Eigenschaften besi
>zen, die entweder bei der Erstellung oder später während der Lauf>tzen, die entweder bei der Erstellung oder später während der Lau
>zeit hinzugefügt werden. Darüber hinaus kann jedes Objekt ein Pro>fzeit hinzugefügt werden. Jedes beliebige Objekt kann ein Prototy
>totype für ein anderes Objekt sein, sodass sich die Objekte die E>pe für ein anderes Objekt sein, sodass sich die Objekte die Eigen
>igenschaften teilen.>schaften teilen.
n35      JavaScript folgt einem ähnlichen Modell, jedoch gibt es kein35      JavaScript folgt einem ähnlichen Modell, jedoch gibt es hie
>ne seperate Klassendefintion unabhängig vom Konstruktor eines Obj>r keine seperate Klassendefintion unabhängig vom Konstruktor eine
>ekts. Stattdessen definiert man eine Konstruktorfunktion, womit O>s Objekts. Stattdessen definiert man eine Konstruktorfunktion, wo
>bjekte mit bestimmten in der Definition festgelegten Eigenschafte>mit beim Aufruf Objekte mit bestimmten in der Definition festgele
>n und Werten erstellt werden. Jede beliebige JavaScript-Funktion >gten Eigenschaften und Werten erstellt werden. Jede beliebige Jav
>kann dabei als Konstruktor verwendet werden. Der Operator <code>n>aScript-Funktion kann als Konstruktor verwendet werden. Der Opera
>ew</code> kommt in Verbindung mit der Konstruktorfunktion für die>tor <code>new</code> kommt in Verbindung mit der Konstruktorfunkt
> Erstellung von Objekten zum Einsatz.>ion für die Erstellung von Objekten zum Einsatz.
n41      Bei einer klassenbasierten Sprache kommt die Hierarchie vonn41      Bei einer klassenbasierten Sprache kommt die Hierarchie von
> Klassen durch die Definition von Klassen zustande. Bei der Defin> Klassen durch die Definition von Klassen zustande. Bei der Defin
>ition einer Klasse kann man festlegen, ob die neue Klasse eine Ki>ition einer Klasse legt man fest, ob die neue Klasse eine Kindkla
>ndklasse von einer bereits bestehenden Klasse sein soll. Die Kind>sse von einer bereits bestehenden Klasse sein soll. Die Kindklass
>klasse erbt sodann alle Eigenschaften der Elternklasse. Zusätzlic>e erbt sodann alle Eigenschaften der Elternklasse. Zusätzlich kön
>h können der Kindklasse neue Eigenschaften hinzugefügt, oder die >nen der Kindklasse neue Eigenschaften hinzugefügt, oder die von d
>von der Elternklasse geerbten Eigenschaften verändert werden. Neh>er Elternklasse geerbten Eigenschaften verändert werden. Nehmen w
>men wir z. B. an, die Klasse <code>Employee</code> würde ausschli>ir z. B. an, die Klasse <code>Employee</code> würde ausschließlic
>eßlich Eigenschaften für den Namen und die Abteilung der jeweilig>h Eigenschaften für den Namen und die Abteilung der jeweiligen Mi
>en Mitarbeiter besitzen. Dann kann man eine Klasse <code>Manager<>tarbeiter besitzen. Dann kann man eine Klasse <code>Manager</code
>/code> als Kindklasse der Klasse <code>Employee</code> erstellen >> als Kindklasse der Klasse <code>Employee</code> erstellen und d
>und dieser eine Eigenschaft für Berichte hinzufügen. Eine Instanz>ieser eine Eigenschaft für Berichte hinzufügen. Eine Instanz der 
> der Managerklasse würde dann alle drei Eigenschaften besitzen: N>Managerklasse würde dann alle drei Eigenschaften besitzen: Name, 
>ame, Abteilung und Berichte.>Abteilung und Berichte.
n47      Bei klassenbasierten Sprachen erstellt man in der Regel einn47      Bei klassenbasierten Sprachen erstellt man in der Regel ein
>e Klasse während der Kompilierung und erzeugt dann Klasseninstanz>e Klasse während der Kompilierung und erzeugt dann Klasseninstanz
>en entweder bereits bei der Kompilierung oder zur Laufzeit. Nach >en entweder bereits bei der Kompilierung oder zur Laufzeit. Nach 
>Erstellung der Klasse können keine Eigenschaften mehr hinzugefügt>Erstellung der Klasse können keine Eigenschaften hinzugefügt, ent
>, entfernt oder die Art von Eigenschaften geändert werden. JavaSc>fernt oder die Art von Eigenschaften geändert werden. JavaScript 
>ript erlaubt hingegen das Hinzufügen oder Entfernen von Eigenscha>erlaubt hingegen das Hinzufügen oder Entfernen von Eigenschaften 
>ften oder Objekten auch während der Laufzeit; wird einem Objekt e>oder Objekten auch während der Laufzeit; wird einem Objekt eine n
>ine neue Eigenschaft hinzugefügt, das als Prototype für ein ander>eue Eigenschaft hinzugefügt, das als Prototype für ein anderes Ob
>es Objekt fungiert, so erhält auch das erbende Objekt diese neue >jekt fungiert, so erhält auch das erbende Objekt diese neue Eigen
>Eigenschaft.>schaft.
n53      Die folgende Tabelle gibt einen schnellen Überblick über ein53      Die folgende Tabelle gibt einen schnellen Überblick über ei
>nige der Unterschiede. Der Rest dieses Kapitels informiert detail>nige der Unterschiede zwischen JavaScript und Java. Der Rest dies
>liert über JavaScript-Konstruktoren und Prototypen für die Erstel>es Kapitels beschreibt JavaScript-Konstruktoren und Prototypen fü
>lung von Objekthierarchien und vergleicht das Konzept von JavaScr>r die Erstellung von Objekthierarchien genauer und vergleicht das
>ipt mit dem von Java.> Konzept von JavaScript mit dem von Java.
n120    <h2 id="Das_Mitarbeiter-Beispiel">n120    <h2 id="Das_Employee-Beispiel">
n159      Dieser Abschnitt beschreibt, wie mit sehr einfachen (jedochn159      In diesem Abschnitt wird beschrieben, wie mit sehr einfache
> relativ unflexiblen) Definitionen eine Vererbungshierarchie erst>n (jedoch relativ unflexiblen) Definitionen eine Vererbungshierar
>ellt werden kann. Bei diesen Definitionen können den Eigenschafte>chie aufgebaut werden kann. Bei diesen Definitionen können den Ei
>n eines Objekts bei der Erstellung keine Werte zugewiesen werden.>genschaften eines Objekts bei der Erstellung keine eigenen Werte 
> Die neu erstellten Objekte erhalten zunächst Anfangswertewelch>zugewiesen werden. Den neu erstellten Objekten werden Anfangswert
>e dann später geändert werden können. Das Schaubild 8.2 stellt di>e zugewiesendie erst später geändert werden können. Das Schaubi
>e Hierarchie mit diesen simplen Defintionen dar.>ld 8.2 stellt die Hierarchie mit diesen simplen Definitionen dar.
160    </p>
161    <p>160    </p>
161    <p>
162      Bei einer echten Applikation würde man evtl. Konstruktoren 162      Bei einer echten Applikation würde man evtl. Konstruktoren 
>definieren, womit den Objekteigenschaften bei der Erzeugung Anfan>definieren, womit den Objekteigenschaften bei der Erzeugung selbs
>gswerte zugewiesen werden; (siehe {{ linkToFragment("More Flexibl>tdefinierte Anfangswerte zugewiesen werden können; (siehe {{ link
>e Constructors") }} für weitere Informationen). An dieser Stelle >ToFragment("More Flexible Constructors") }} für weitere Informati
>begnügen wir uns jedoch mit einfachen Definitionen, um rein die G>onen). Zu Anfang begnügen wir uns jedoch mit einfachen Definition
>rundstruktur der Vererbungshierarchie zu veranschaulichen.>en, um rein die Grundstruktur der Vererbungshierarchie zu veransc
 >haulichen.
n338      Bei diesem Vorgang werden dem Objekt <code>mark</code> nichn338      Bei diesem Vorgang werden dem Objekt für die Eigenschaften,
>t explizit (<em>lokale</em>) Werte für die Eigenschaften zugewies> die <code>mark</code> von der Prototypekette erbt, nicht explizi
>en, die <code>mark</code> von der Prototypekette erbt. Sondern we>t (<em>lokale</em>) Werte für die Eigenschaften zugewiesen. Wenn 
>nn der Wert einer Eigenschaft abgefragt wird, überprüft JavaScrip>der Wert einer Eigenschaft abgefragt wird, überprüft JavaScript z
>t zunächst, ob dieser Wert lokal existiert; trifft dies zu, wird >unächst, ob dieser Wert lokal existiert; trifft dies zu, wird der
>der Wert zurückgegeben; falls die Eigenschaft lokal nicht existie> Wert zurückgegeben. Falls die Eigenschaft lokal nicht existiert,
>rt, überprüft JavaScript die Prototypekette (über die Eigenschaft> überprüft JavaScript die Prototypekette (über die Eigenschaft <c
> <code>__proto__</code>). Besitzt ein Objekt in der Prototypekett>ode>__proto__</code>) und besitzt ein Objekt in der Prototypekett
>e einen Wert für die Eigenschaft, wird dieser zurückgegeben. Fall>e einen Wert für die Eigenschaft, wird dieser zurückgegeben. Fall
>s gar keine solche Eigenschaft gefunden wird, meldet JavaScript, >s gar keine solche Eigenschaft gefunden wird, meldet JavaScript, 
>dass das Objekt keine solche Eigenschaft besitzt. Demzufolge hat >dass das Objekt keine solche Eigenschaft besitzt. Demzufolge hat 
>das Objekt <code>mark</code> die folgenden Eigenschaften und Wert>das Objekt <code>mark</code> die folgenden Eigenschaften und Wert
>e:>e:
n346      Das <code>mark</code>-Objekt erbt die Werte für die Eigenscn346      Das <code>mark</code>-Objekt erbt die Werte für die Eigensc
>haften <code>name</code> und <code>dept</code> vom prototypischen>haften <code>name</code> und <code>dept</code> vom prototypischen
> Objekt in <code>mark.__proto__</code>. Diesem wurde ein lokaler > Objekt in <code>mark.__proto__</code>. Diesem wurde ein lokaler 
>Wert für die Eigenschaft <code>projects</code> über <code>WorkerB>Wert für die Eigenschaft <code>projects</code> über die <code>Wor
>ee</code>-Konstruktorfunktion zugewiesen. Mit diesem Gefüge wird >kerBee</code>-Konstruktorfunktion zugewiesen. Durch dieses Gefüge
>die Vererbung von Eigenschaften bei JavaScript realisiert. Einige> wird bei JavaScript Vererbung konstruiert. Einige weitere Detail
> weitere Details zu diesem Vorgang sind im Kapitel {{ linkToFragm>s zu diesem Vorgang sind im Kapitel {{ linkToFragment("Property I
>ent("Property Inheritance Revisited") }} beschrieben.>nheritance Revisited") }} beschrieben.
n488      Diese JavaScript-Definitionen verwenden ein spezielles Konsn488      Diese JavaScript-Definitionen setzen eine spezielle logisch
>trukt für Default-Werte:>e Verknüpfung für Default-Werte ein:
n494      Der JavaScript-Operator für das logische ODER (<code>||</con494      Der JavaScript-Operator für das logische ODER (<code>||</co
>de>) wertet das ihm vorangestellte Argument aus; wenn dieses zu <>de>) wertet das ihm vorangestellte Argument aus. Wenn dieses zu <
>code>true</code> evaluiert, wird der Wert zurückgegeben. Andernfa>code>true</code> evaluiert, wird der Wert zurückgegeben. Andernfa
>lls wird der Wert des zweiten Arguments hinter dem Operator zurüc>lls wird der Wert des zweiten Arguments hinter dem Operator zurüc
>kgegeben. Mit dem Ausdruck wird also überprüft, ob <code>name</co>kgegeben. Mit dem Ausdruck wird also überprüft, ob <code>name</co
>de> einen brauchbaren Wert besitzt, welcher der Eigenschaft <code>de> einen brauchbaren Wert besitzt, welcher der Eigenschaft <code
>>this.name</code> zugewiesen werden kann. Falls ja, bekommt <code>>this.name</code> zugewiesen werden kann. Falls ja, bekommt <code
>>this.name</code> diesen Wert. Andernfalls wird <code>this.name</>>this.name</code> diesen Wert. Andernfalls wird <code>this.name</
>code> ein leerer String zugewiesen. In diesem Kapitel wird auf di>code> ein leerer String zugewiesen. In diesem Kapitel wird auf di
>eses Konstrukt zurückgegriffen, um die Code-Beispiele knapp und ü>eses Konstrukt zurückgegriffen, um die Code-Beispiele knapp und ü
>bersichtlich zu halten.>bersichtlich zu halten.
n518      Bisher haben wir mit der Konstruktorfunktion ein generischen518      Bisher haben wir mit der Konstruktorfunktion ein generische
>s Objekt erstellt und dann lokale Eigenschaften und Werte zugewie>s Objekt erstellt und dann lokale Eigenschaften und Werte zugewie
>sen. Mit dem Konstruktor können mehr Eigenschaften hinzugefügt we>sen. Ebenso kann man auch die Konstruktorfunktion eines in der Pr
>rden, indem direkt die Konstruktorfunktion eines in der Prototypk>ototypkette höherliegenden Objekts aufrufen, um dem Objekt die en
>ette höherliegenden Objekts aufgerufen wird. Das folgende Schaubi>tsprechenden Eigenschaften hinzuzufügen. Das folgende Schaubild z
>ld zeigt diese Definitionen.>eigt diese neuen Definitionen.
n563      Es scheint so, als hätte man mit dem Aufruf des <code>Worken563      Es scheint so, als hätte man mit dem Aufruf des <code>Worke
>rBee</code>-Konsturktors aus dem <code>Engineer</code>-Konstrukto>rBee</code>-Konstruktors aus dem <code>Engineer</code>-Konstrukto
>r heraus die Vererbung für <code>Engineering</code>-Objekte berei>r heraus die Vererbung für das <code>Engineering</code>-Objekte i
>ts korrekt implementiert. Das ist jedoch nicht der Fall. Mit dem >nitiiert. Das ist jedoch nicht der Fall. Der Aufruf des <code>Wor
>Aufruf des <code>WorkerBee</code>-Konstuktors wird sichergestellt>kerBee</code>-Konstuktors stellt sicher, dass ein <code>Engineeri
>, dass ein <code>Engineering</code>-Objekt mit allen Eigenschafte>ng</code>-Objekt mit allen Eigenschaften erstellt wird, welche du
>n erstellt wird, welche durch aufgerufene Konstruktorfunktionen h>rch die aufgerufene Konstruktorfunktionen hinzugefügt wurden. Füg
>inzugefügt wurden. Fügt man den Prototypen von <code>Employee</co>t man den Prototypen von <code>Employee</code> oder <code>WorkerB
>de> oder <code>WorkerBee</code> später Eigenschaften hinzu, so we>ee</code> später Eigenschaften hinzu, so werden diese nicht vom <
>rden diese nicht vom <code>Engineer</code>-Objekt geerbt. Hat man>code>Engineer</code>-Objekt geerbt. Hat man z. B. die folgenden A
> z. B. die folgenden Anweisungen:>nweisungen:
n575      Dann erbt das Objekt <code>jane</code> die Eigenschaft <codn575      Dann erbt das Objekt <code>jane</code> die Eigenschaft <cod
>e>specialty</code> nicht. Der Prototype muss explizit zugewiesen >e>specialty</code> nicht. Der Prototype muss explizit zugewiesen 
>werden, um die dynamische Vererbung zu umzusetzen. Verändert man >werden, um dynamische Vererbung umzusetzen. Verändert man den Cod
>den Code wie folgt:>e wie folgt:
n591      Eine weitere Möglichkeit zur Umsetzung der Vererbung ist den591      Eine weitere Möglichkeit zur Umsetzung von Vererbung ist de
>r Einsatz der Methoden <a href="/en-US/docs/JavaScript/Reference/>r Einsatz der Methoden <a href="/en-US/docs/JavaScript/Reference/
>Global_Objects/Function/call" title="en-US/docs/JavaScript/Refere>Global_Objects/Function/call" title="en-US/docs/JavaScript/Refere
>nce/Global Objects/Function/call"><code>call()</code></a> / <a hr>nce/Global Objects/Function/call"><code>call()</code></a> / <a hr
>ef="/en-US/docs/JavaScript/Reference/Global_Objects/Function/appl>ef="/en-US/docs/JavaScript/Reference/Global_Objects/Function/appl
>y" title="en-US/docs/JavaScript/Reference/Global Objects/Function>y" title="en-US/docs/JavaScript/Reference/Global Objects/Function
>/apply"><code>apply()</code></a>. Der folgende Code ist äquivalen>/apply"><code>apply()</code></a>. Der folgende Code ist äquivalen
>t:>t:
n625    <h3 id="Lokalen_und_vererbte_Werte">n625    <h3 id="Lokale_und_vererbte_Werte">
n642      Das Ergebnis dieses Ablaufs hängt von den Definitionen ab. n642      Das Ergebnis dieses Ablaufs hängt von den Definitionen ab. 
>Das Beispiel am Anfang des Kapitels war so definiert:>Kommen wir noch einmal auf das Beispiel vom Anfang des Kapitels z
 >urück:
n701      Dann besitzt die Eigenschaft <code>amy</code> den Wert <codn701      Dann besitzt die Eigenschaft <code>name</code> von <code>am
>e>"Unknown"</code>.<br>>y</code> den Wert <code>"Unknown"</code>.<br>
n703      Wie diese Beispiele zeigen, sollte man also Werte im Prototn703      Wie diese Beispiele zeigen, sollte man also Werte dem Proto
>ype des Konstruktors zuweisen und nicht in der Konstruktorfunktio>type des Konstruktors zuweisen und nicht in der Konstruktorfunkti
>n selbst, falls man Default-Werte für Objekteigenschaften setzen >on, falls man Default-Werte für Objekteigenschaften setzen und di
>und diese während der Laufzeit ändern möchte.>ese während der Laufzeit ändern möchte.
n712      Die spezielle Eigenschaft <code>__proto__</code> wird bei dn712      Die spezielle Eigenschaft <code>__proto__</code> wird bei d
>er Erzeugung eines Objekts gesetzt; der Wert dieser Eigenschaft i>er Erzeugung eines Objekts gesetzt. Der Wert dieser Eigenschaft i
>st dann die <code>prototype</code>-Eigenschaft des Konstruktors. >st dann die <code>prototype</code>-Eigenschaft des Konstruktors. 
>Demzufolge wird mit dem Ausdruck <code>new Foo()</code> ein Objek>Demzufolge wird mit dem Ausdruck <code>new Foo()</code> ein Objek
>t mit <code>__proto__ == <code class="moz-txt-verticalline">Foo.p>t mit <code>__proto__ == <code class="moz-txt-verticalline">Foo.p
>rototype</code></code> erstellt. Änderungen der Eigenschaften von>rototype</code></code> erstellt. Änderungen der Eigenschaften von
> <code class="moz-txt-verticalline">Foo.prototype</code> werden f> <code class="moz-txt-verticalline">Foo.prototype</code> werden f
>ür alle Objekte übernommen, die mit <code>new Foo()</code> erzeug>ür alle Objekte übernommen, die mit <code>new Foo()</code> erzeug
>t wurden.>t wurden.
n741      Unter diesen Umständen könnte man eine Funktion <code>instan741      Und man könnte z. B. eine Funktion <code>instanceOf</code> 
>nceOf</code> wie folgt schreiben:>wie folgt schreiben:
n757      <strong>Achtung:</strong> Die Implementierung der Funktion n757      <strong>Achtung:</strong> Die Implementierung dieser Funkti
>überprüft den Typ des Objekts gegen "xml", um eine Eigenheit von >on überprüft den Typ des Objekts gegen "xml", um eine Eigenheit v
>neueren JavaScript-Versionen bei der Repräsentation von XML-Objek>on neueren JavaScript-Versionen bei der Repräsentation von XML-Ob
>ten zu beachten. Siehe {{ bug(634150) }} für weitere Informatione>jekten zu beachten. Siehe {{ bug(634150) }} für weitere Informati
>n.>onen.
n778      Bei der Erstellung von Konstruktoren ist Vorsicht geboten, n778      Bei der Erstellung von Konstruktoren ist Vorsicht geboten, 
>wenn man globale Werte im Konstruktor verändert. Möchte man z. B.>wenn man globale Werte im Konstruktor verändert. Möchte man z. B.
> für jedes <code>Empoyee</code>-Objekt eine eindeutige ID generie> für jedes <code>Empoyee</code>-Objekt eine eindeutige ID generie
>ren und dem Objekt automatisch zuweisen, so könnte man <code>Empl>ren und automatisch dem Objekt zuweisen, so könnte man <code>Empl
>oyee</code> wie folgt definieren:>oyee</code> wie folgt definieren:
n797      Auf den ersten Blick mag erscheint diese Vorgensweise unpron797      Auf den ersten Blick mag diese Vorgensweise unproblematisch
>blematisch erscheinen, da <code>idCounter</code> jedoch bei jeder> erscheinen. Man sollte jedoch bedenken, dass <code>idCounter</co
> Erstellung eines <code>Employee</code>-Objekts inkrementiert wir>de> bei jeder Erstellung eines <code>Employee</code>-Objekts inkr
>d, kann diese Implementierung problematisch sein. Hätte man z. B.>ementiert wird. Hätte man z. B. unter Verwendung dieser Definitio
> unter Verwendung dieser Definitionen die komplette in diesem Kap>nen die komplette in diesem Kaptitel beschriebene Vererbungshiera
>titel beschriebene Vererbungshierarchie erstellt, dann würde der >rchie erstellt, dann würde der <code>Employee</code>-Konstuktor b
><code>Employee</code>-Konstuktor bei jeder Zuweisung eines Protot>ei jeder Zuweisung eines Prototype aufgerufen.
>ype aufgerufen. 
n826      Weiter angenommen, die Definitionen, deren Definitionen hien826      Weiter angenommen, die Funktionen der übrigen Objekte, dere
>r nicht gezeigt wurden, würden die&nbsp; <code>base</code>-Eigens>n Definitionen hier nicht gezeigt wurden, würden die <code>base</
>chaft besitzen und den Konstruktor des darüberliegenden Objekts i>code>-Eigenschaft besitzen und den Konstruktor des darüberliegend
>n der Prototypekette aufrufen, dann bekäme <code>mac.id</code> be>en Objekts in der Prototypekette aufrufen. Dann bekäme <code>mac.
>i der Erstellung von <code>mac</code> den Wert <code>5</code>.>id</code> bei der Erstellung von <code>mac</code> den Wert <code>
 >5</code>.
n840      Bei der Erstellung einer <code>Employee</code>-Instanz, dien840      Bei der Erstellung einer <code>Employee</code>-Instanz, die
> als Prototype dient, übergibt man dann einfach keine Argumente a> als Prototype dient, übergibt man einfach keine Argumente an den
>n den Konstruktor. Beim Aufruf des Konstruktors wird <code>id</co> Konstruktor. Beim Aufruf des Konstruktors wird dann <code>id</co
>de> kein Wert zugewiesen und die Zählervariable nicht erhöht. Dam>de> kein Wert zugewiesen und die Zählervariable nicht erhöht. Dam
>it eine Employee-Instanz eine ID zugewiesen bekommt, muss ein nam>it eine Employee-Instanz eine ID zugewiesen bekommt, muss <code>n
>e als Argument übergeben werden. Bei diesem Beispiel hätte dann <>ame</code> als Argument übergeben werden. Bei diesem Beispiel hät
>code>mac.id</code> den Wert <code>1</code>.>te dann <code>mac.id</code> den Wert <code>1</code>.
n842    <h3 id="No_multiple_inheritance">n842    <h3 id="Keine_mehrfache_Vererbung">
n871      Zusätzlich nehmen wir an, dass die Definition so benutzt win871      Wird diese Definition so benutzt, wie im vorherigen Abschni
>rd, wie im vorherigen Abschnitt gezeigt. In diesem Fall hätte das>tt gezeigt, dann besitzt das Objekt <code>dennis</code> diese Eig
> Objekt <code>dennis</code> dann diese Eigenschaften:>enschaften:
n881      Hier sieht man, dass <code>dennis</code> die Eigenschaft <cn881      Die Eigenschaft <code>hobby</code> des <code>dennis</code>-
>ode>hobby</code> des <code>Hobbyist</code>-Konstruktors nicht zug>Objekts bekommt also nicht den Wert des <code>Hobbyist</code>-Kon
>ewiesen bekommt. Man könnte dem Prototype des Hobbyist-Konstrukto>struktors zugewiesen. Und angenommen man fügt dem Prototype des H
>rs die Eigenschaft hinzufügen:>obbyist-Konstruktors die Eigenschaft hinzu:
t887      Das Objekt <code>dennis</code> erbt diese neue Eigenschaft t887      Dann erbt das Objekt <code>dennis</code> diese neue Eigensc
>nicht.>haft nicht.

Zurück zur Versionsgeschichte