Calocybe: Objekte, die Objekte enthalten (Definition: WIE?)

Beitrag lesen

Hallo Antje!

Och Antje, warum zwingst Du mich denn dazu...?!

Also erstmal noch der obligatorische Hinweis: Man kann einen Quelltext auch lesbar aufschreiben, siehe weiter unten fuer Beispiele. ;-) Bei einem unlesbaren Quelltext nuetzt die beste Erklaerung nichts. Und nebenbei waeren Dir dann vielleicht weniger Fehler passiert. ;-(

Du definierst dir eine Funktion. Diese legt die Eigenschaft des Fuhrparkes -die Autonummer fest.

function Fuhrpark(num)
{this.num=num;}

Anschließend machst du das Gleiche mit dem Auto selbst.

function auto(marke,kilometer,verbrauch,fahrer)
{
this.marke=marke;
this.kilometer=kilometer;
this.verbrauch=verbrauch;
this.fahrer=fahrer;
}

Hier jetzt Deine reformatierte Funktion newAuto():

function newAuto() {

»»     for (i=0; i<4; i++) {
»»         new fuhrpark("auto"+i);
»»         fuhrpark["auto"+i]=new auto("Audi",3000,7,"Schulze");
»»     }
»»     alert(fuhrpark.auto2.marke)

}

Die Zeile   new fuhrpark("auto"+i);  ist erstens falsch (denn die Funktion Fuhrpark hast Du mit grossem F geschrieben) und zweitens sinnlos, da das eben erzeugte Objekt einfach weggeschmissen wird, weil Du den Rueckgabewert von new (naemlich das Objekt) an keine Variable zuweist. Dann willst Du auf fuhrpark["auto" + i] zugreifen, hast fuhrpark aber niemals deklariert (Fehlermeldung "fuhrpark is not defined"). Wahrscheinlich hast Du stattdessen folgendes gemeint:

function newAuto() {
    for (i=0; i<4; i++) {
        fuhrpark = new Fuhrpark("auto"+i);
        fuhrpark["auto"+i]=new auto("Audi",3000,7,"Schulze");
    }
    alert(fuhrpark.auto2.marke)
}

Das ist aber immer noch ziemlich unsinnig, da Du in der Schleife viermal einen Fuhrpark anlegst, und dabei jeweils den vorher erzeugten ueberschreibst. Am Ende hast Du ein Objekt fuhrpark mit folgenden Eigenschaften:
    fuhrpark.num == "auto3"
    fuhrpark.auto3 == Objekt auto("Audi", 3000, 7, "Schulze")

Die alert-Anweisung wird den Fehler "fuhrpark.auto2 has no properties" hervorrufen.

Was Du wohl eigentlich gemeint hast, ist:

var fuhrpark = new Fuhrpark(0);

function newAuto() {
        for (i=0; i<4; i++) {
            fuhrpark["auto"+i] = new auto("Audi",3000,7,"Schulze");
        }
        alert(fuhrpark.auto2.marke)
    }

Wie Dir sicher auffaellt, ist der Parameter 'num' fuer Fuhrpark ueberfluessig. Ich habe ihn daher erstmal einfach mit 0 belegt. Mit diesem Code erhalst Du nun also ein Objekt fuhrpark mit folgenden Eigenschaften:

fuhrpark.num == 0
    fuhrpark.auto0 == Objekt auto("Audi", 3000, 7, "Schulze")
    fuhrpark.auto1 == Objekt auto("Audi", 3000, 7, "Schulze")
    fuhrpark.auto2 == Objekt auto("Audi", 3000, 7, "Schulze")
    fuhrpark.auto3 == Objekt auto("Audi", 3000, 7, "Schulze")

Nun nochmal Deine obigen Funktionen zusammen, damit Frank sie alle auf einen Blick hat:

function Fuhrpark() {       // constructor fuer einen Fuhrpark
    }

function auto(marke, kilometer, verbrauch, fahrer) {    // constructor fuer ein auto
        this.marke = marke;
        this.kilometer = kilometer;
        this.verbrauch = verbrauch;
        this.fahrer = fahrer;
    }

var fuhrpark;

function newAuto() {
        fuhrpark = new Fuhrpark();          // Anlegen von fuhrpark (Typ ist: Objekt Fuhrpark)
        for (i=0; i<4; i++) {
            fuhrpark["auto"+i] = new auto("Audi", 3000, 7, "Schulze");
        }
        alert(fuhrpark.auto2.marke)
    }

Mit  fuhrpark = new Fuhrpark()  erzeugst Du ein Fuhrpark-Objekt, das in der Variablen  fuhrpark  gespeichert wird.
new ist ein reserviertes Wort zur Erzeugung eines neuen Objektes. Hinter new schreibt man den Namen einer Funktion, die das Objekt bei Bedarf mit bestimmten Werten initialisieren kann. Diese Funktion nennt man Constructor des Objektes und tut in obigem Beispiel gar nichts.

Anschliessend werden in der for-Schleife 4 auto-Objekte erzeugt, die dann als Eigenschaften dem fuhrpark zugewiesen werden. Der Constructor des auto-Objektes nimmt 4 Parameter und initialisiert damit die Eigenschaften des Objektes (naemlich marke, kilometer, verbrauch, fahrer).

Deshalb auch die Verwendung von this. Dieses reservierte Wort spricht die aktuelle Instanz des aktuellen -hier neu erzeugtem Objektes an und weist ihm die neuen Eigenschaften zu.

Zuletzt wird in dem alert-Fenster der Wert von fuhrpark.auto2.marke ausgegeben (ist natuerlich "Audi"). Es ist dabei egal, ob man
    fuhrpark.auto2.marke        oder
    fuhrpark["auto2"].marke     oder
    fuhrpark.auto2["marke"]     oder
    fuhrpark["auto2"]["marke"]
schreibt, alle vier Formen sind voellig gleichbedeutend.

Zum Testen hier mal ein Beispiel, bewußt modifiziert. Dieses erkläre ich nicht, aber du kannst ja mal versuchen mir zu erklären, was hier passiert.

(von mir ein bisschen ausgebessert)

<html>
<head>
    <title>Neue Objekte</title>
</head>

<body onLoad="newAuto()">

<script language="JavaScript"><!--

function auto(marke, kilometer, verbrauch, fahrer) {
        this.marke = marke;
        this.kilometer = kilometer;
        this.verbrauch = verbrauch;
        this.fahrer = fahrer;
    }

M1=new Array("Audi","Opel","A4","A5");
    V1=new Array(2,3,4,5);

autos = new Array();
    
    function newAuto() {
        for (i=0;i<4;i++) {
            autos[i] = new auto(M1[i], 3000, V1[i], "Schulze");
        }
        alert(autos[1].marke)
    }

//--></script>

<p>Warum verzichte ich auf den Fuhrpark?</p>
<p><a href="javascript:alert(auto[3].verbrauch);">Verbrauch</a>   </p>

</body>
</html>

Sorry Antje, aber heute hast Du Dich nicht so sehr mit Ruhm bekleckert.
Roland