Brummifahrer: Mein erster Versuch

Hallo!

Ich habe mal ein bisschen mit Java Skript herumgebastelt. Leider klappt aber das folgende Programm nicht:
<html>
<head>
.
.
.
.
<script>
 function Auto(){
  this.tachostand = 100;
  }
  function fahren(weg){
   this.tachostand = this.tachostand + weg;
  }
</script>
</head>
<body>
.
.
.
<script language="JavaScript">
 var PKW = new Auto();
 document.write("Tachostand: " + PKW.tachostand);
 PKW.fahren(100);
 document.write("Tachostand: " + PKW.tachostand);
</script>
.
.
.
.
</html>

Ich erhalte immer die Fehlermeldung, dass das Objekt (PKW) die Eigenschaft oder Methode (fahren) nicht unterstützt.

Was mache ich falsch?

Dank und Gruß aus der Westpfalz!

Der Brummifahrer

  1. Hallöle!

    Du wirst die Funktion "tanken" vergessen haben, ebenso wie die Funktion "anlassen". Oder so. Cheatah weiss das bestimmt besser als ich. Kann sein, dass er dir hilft. Aber ich glaube, sein Programm funktioniert... ;o)

    File Griese,

    Stonie

    --
    sh:) sh:| fo:) ch:) rl:| br:< ie:% mo:} va:| de:[ zu:) fl:( ss:{ ls:# js:| - Noch Fragen?
    1. So wird es klappen

      <html>
      <head>
      <script>

      function Auto(){
        this.tachostand = 100;
        }

      function fahren(pkw,weg){
         pkw.tachostand = pkw.tachostand + weg;
        }

      </script>
      </head>
      <body>

      <script language="JavaScript">
       var PKW = new Auto();
       document.write("Tachostand: " + PKW.tachostand);

      fahren(PKW,400);
       document.write("Tachostand: " + PKW.tachostand);
      </script>
      </html>

      1. Hallo Urmel!

        So wird es klappen

        Ohne tanken? Respekt!

        File Griese,

        Stonie

        --
        sh:) sh:| fo:) ch:) rl:| br:< ie:% mo:} va:| de:[ zu:) fl:( ss:{ ls:# js:| - Noch Fragen?
        1. Ohne tanken? Respekt!

          Nein, so klappt es auch nicht. Das Tanken fehlt wohl wirklich :-)

          1. Nein, so klappt es auch nicht. Das Tanken fehlt wohl wirklich :-)

            Bitte ? wie so klappt es auch nicht?
            ernst gemeint?
            also bei mir funzt es super.
            Hast du den quelltext auch 1zu1 kopiert?

        2. LOL, ja die tankmethode kommt dann später noch hinzu, aber im moment reichen erstma die solarbrennstoffzellen mit eingebautem Flux-Kompensator und einem atombrennstab(angereichertes Uran). Was allerddings wohl nicht ganz der KFZ norm entspricht. *GG*

      2. Hallo,

        So wird es klappen

        Er wollte mit JavaScript ein Objekt (Auto) mit Eigenschaften (Tachostand) und Methoden (fahren) bauen. Das würde so aussehen:

        <html>
        <head>
        <title></title>
        <script type="text/javascript">
         function Auto(){
          this.tachostand =100;
          function fahren(weg){
           this.tachostand = this.tachostand + weg;
          }
          this.fahren=fahren;
         }
        </script>
        </head>
        <body >
        <script type="text/javascript">
         var PKW = new Auto();
         document.write("Tachostand: " + PKW.tachostand + "<br>");
         PKW.fahren(100);
         document.write("Tachostand: " + PKW.tachostand);
        </script>
        </body>
        </html>

        Trotzdem ist JavaScript _nicht_ für solche Konstrukte geeignet. Es gibt keine selbst definierten Klassen und somit keine selbst definierten Objekte in JavaScript. Eine Funktion bleibt eine Funktion.

        viele Grüße

        Axel

        1. aaaaahhh *großeerleuchtung*
          so geht das also, wow, hier kann man echt noch was dazu lernen.
          Aber wie schaut es dann beim initialisieren des objekts aus, wird da nicht automatisch die fahren function aufgerufen, welche dann das problem hat, oder auch nicht, das weg nicht definiert ist, bzw. keinen wert hat?
          oder kann ich auch einen undefinierten wert mit einem wert addieren?

          1. Hallo,

            Aber wie schaut es dann beim initialisieren des objekts aus, wird da nicht automatisch die fahren function aufgerufen, welche dann das problem hat, oder auch nicht, das weg nicht definiert ist, bzw. keinen wert hat?

            Nein. Beim Initialisieren wird ja nicht die Funktion Auto() aufgerufen, sondern mit dem Operator new wird diese Funktion als Quasi-Objekt in den Arbeitsspeicher gelegt. Dabei wird die Variable/Eigenschaft(ja was eigentlich?) tachostand gesetzt (this.tachostand=100) und die Methode/Variable/Eigenschaft(was nun eigentlich?) fahren verweist auf die Funktion fahren() (this.fahren=fahren).

            Das genau ist das Problem hierbei. Einmal die "was nun eigentlich?", die mir noch niemand wirklich erklären konnte, hauptsächlich aber das Speichermanagement. Mir sind schon Beispiele untergekommen, bei denen solche Pseudo-Objekte das System zum Stillstand gebracht haben, mit 100% Speicherauslastung.

            viele Grüße

            Axel

            1. Hallo,

              Aber wie schaut es dann beim initialisieren des objekts aus, wird da nicht automatisch die fahren function aufgerufen, welche dann das problem hat, oder auch nicht, das weg nicht definiert ist, bzw. keinen wert hat?
              Nein. Beim Initialisieren wird ja nicht die Funktion Auto() aufgerufen, sondern mit dem Operator new wird diese Funktion als Quasi-Objekt in den Arbeitsspeicher gelegt. Dabei wird die Variable/Eigenschaft(ja was eigentlich?)

              Eigenschaft, da sie zum Objekt gehört. (this.)

              Methode/Variable/Eigenschaft(was nun eigentlich?) fahren verweist auf die Funktion fahren() (this.fahren=fahren).

              Methode, da sie auf eine Funktion verweist, und aufrufbar ist (mit parametern und so)

              Das genau ist das Problem hierbei. Einmal die "was nun eigentlich?", die mir noch niemand wirklich erklären konnte, hauptsächlich aber das Speichermanagement.

              Eigenschaften halten Daten bereit (z.B. number, boolean, string, object, arrays), also wie Variablen und Methoden sind Funktionen, beides nur mit dem Unterschied das sie objektgebunden sind.

              Mir sind schon Beispiele untergekommen, bei denen solche Pseudo-Objekte das System zum Stillstand gebracht haben, mit 100% Speicherauslastung.

              Mir noch nie! Vielleicht weil sich ein Objekt immer wieder selbst instanziiert hat:

              function Test()
              {
                 this.test = new Test();
              }

              oder so ähnlich.

              Christian

          2. Hi,

            Aber wie schaut es dann beim initialisieren des objekts aus, wird da nicht automatisch die fahren function aufgerufen, welche dann das problem hat, oder auch nicht, das weg nicht definiert ist, bzw. keinen wert hat?

            die funktion wird nicht aufgerufen, nur definiert:

            this.fahren = fahren;

            da wird die referenz auf die Funktion fahren zugewiesen.

            anders:

            this.fahren = fahren();

            da würde sie aufgerufen und der rückgabewert würde zugewiesen werden.

            Der Funktionsaufruf erfolgt erst wenn die runden klammen gesetzt sind.

            Christian

            1. this.fahren = fahren;

              und woher weiss jetzt Javascript das dies keine einfach variable ist?
              Da es ja scheins vorzeichenlos ist, muss in diesem falle die function den gleichen namen haben wie der "referenz oder art-pointer"wertVariable?

              Und wie schaut es mit diesen function"referenz"zuweisungen wenn die funktion ausserhalb des konstrukt deklariert ist?

              1. this.fahren = fahren;
                und woher weiss jetzt Javascript das dies keine einfach variable ist?

                ich weiß nicht was passieren würde, wenn es noch eine Variable "fahren" gäbe. Die gibt es aber nicht, oder anders, man muss drauf achten, das keine gibt.
                kA, wer Vorrang hat, Variable oder Funktion.

                Da es ja scheins vorzeichenlos ist, muss in diesem falle die function den gleichen namen haben wie der "referenz oder art-pointer"wertVariable?

                nein. man kann auch schreiben:

                this.fahreschnellstmoeglichzu = fahren;

                Und wie schaut es mit diesen function"referenz"zuweisungen wenn die funktion ausserhalb des konstrukt deklariert ist?

                außerhalb geht auch, da die Funktion dann global ist, und auch globale in Funktionen innerhalb von Funktionen erkannt werden:

                function test()
                {
                }

                funtion OBJ()
                {
                this.macheTest = test;
                }

                var o = new OBJ();
                o.machTest(); // würde test() aufrufen.

                folgendenes geht auch:

                this.fahre = function()
                {
                //hier funktionscode
                }

                die Funktion hat keinen Namen--> anonyme Funktionen.
                (ab Netscape/IE 4)

                Christian.

                1. wow, danke dir nochmals Christian (übrigends ein namensvetter ;-))
                  glaube habe das jetzt soweit verstanden.

        2. Er wollte mit JavaScript ein Objekt (Auto) mit Eigenschaften (Tachostand) und Methoden (fahren) bauen.

          Genau das wollte ich.

          Trotzdem ist JavaScript _nicht_ für solche Konstrukte geeignet. Es gibt keine selbst definierten Klassen und somit keine selbst definierten Objekte in JavaScript. Eine Funktion bleibt eine Funktion.

          Ich kannte das halt von Java. Deshalb wollte ich mal versuchen, ob ich es auch in Java Skript hinbekomme.

          1. Hallo,

            Er wollte mit JavaScript ein Objekt (Auto) mit Eigenschaften (Tachostand) und Methoden (fahren) bauen.
            Genau das wollte ich.
            Trotzdem ist JavaScript _nicht_ für solche Konstrukte geeignet. Es gibt keine selbst definierten Klassen und somit keine selbst definierten Objekte in JavaScript. Eine Funktion bleibt eine Funktion.
            Ich kannte das halt von Java. Deshalb wollte ich mal versuchen, ob ich es auch in Java Skript hinbekomme.

            Ja, die JVM hat auch ihr Speichermanagement auf Objekte ausgerichtet un sie hat einen garbage-collector, der nicht mehr benötigten Müll aus dem Arbeitspeicher sammelt. JavaScript wird genau dann dazu in der Lage sein, wenn sein Sprachumfang eine Definition wie:

            class Auto() {
              var tachostand;
              Auto() {
                tachostand = 100;
              }
              fahren(weg) {
                tachostand = tachostand + weg;
              }
            }

            zulässt.

            viele Grüße

            Axel

            1. hallo Brummifahrer, gruss Axel,

              /*

              Er wollte mit JavaScript ein Objekt (Auto) mit Eigenschaften
              (Tachostand) und Methoden (fahren) bauen.

              Genau das wollte ich.

              Trotzdem ist JavaScript _nicht_ für solche Konstrukte geeignet.
              Es gibt keine selbst definierten Klassen und somit keine selbst
              definierten Objekte in JavaScript. Eine Funktion bleibt eine Funktion.

              - in javascript ist alles objekt;
                  - objekte sind container fuer ihre jeweiligen datentypen
                    ("undefined", "string", "number", "boolean", "function", "object");
                  - eine js-function ist demzufolge nur ein spezialisiertes objekt und zusammen
                    mit dem schluesselwort "this" und dem operator "new" als konstruktor-funktion
                    (aehnlich einer klasse) verwendbar;
              */

              /*

              JavaScript wird genau dann dazu in der Lage sein, wenn sein Sprachumfang eine Definition wie:

              class Auto() {         // [0]
                var tachostand;      // {1]
                Auto() {
                  tachostand = 100;
                }
                fahren(weg) {        // [2]
                  tachostand = tachostand + weg;
                }
              }

              zulässt.

              */

              //  ungefaehr so:

              /*0*/function Auto() {
              /*1*/   var tachostand = 100; // private: zugriff auf "tachostand" nur ueber oeffentliche getter- und setter-methoden;
              /*2*/   this.fahren = function(weg) { // public: aehnlich einer setter-methode
                          tachostand += weg;
                      }
                      this.zeigeTacho = function() { // public: getter-methode fuer "tachostand"(private);
                          return tachostand;
                      }
                      this.setzeTacho = function(wert) { // public: setter-methode fuer "tachostand"(private);
                          tachostand = wert;
                      }
                  }
                  // vorteil  - die eigenschaft "tachostand" ist geschuetzt;
                  // nachteil - "Auto()"-objekte sind 1:1-kopien ihres konstruktors und werden
                  //            jeweils mit allen eigenschaften des konstruktors erschaffen(speicher!);

              //  oder auch so:

              /*0*/function AutoProto() {
              /*1*/   this.tachostand = 0; // public: ungeschuetzt, da direkter zugriff(aendern loeschen) moeglich ist;
                  }
              /*2*/AutoProto.prototype.fahren = function(weg) { // public;
                      this.tachostand += weg;
                  }
                  // vorteil  - weniger eigenschaften fuer ein "AutoProto"-objekt;
                  //          - die einzige methode("fahren") wird dem prototypen des konstruktors zugewiesen,
                  //            d.h.: "AutoProto()"-objekte sind keine exakten 1:1 kopien ihres konstruktors:
                  //            sie besiten zwar jeweils die eigenschaft "tachostand"  -  die methode "fahren"
                  //            hingegen gehoert nur dem konstruktor und wird von den einzelnen "AutoProto"-
                  //            objekten als eine art "meta"-methode immer wieder von diesem "ausgeliehen";
                  // nachteil - die eigenschaft "tachostand" ist ungeschuetzt;

              brumm = new Auto();
                  alert("brumm.constructor.toString():\n\n"+brumm.constructor.toString());
                  alert("brumm.tachostand = "+brumm.tachostand); // undefined, da "tachostand" privat ist;
                  alert("brumm.zeigeTacho() = "+brumm.zeigeTacho());
                  brumm.fahren(1134);
                  alert("brumm.fahren(1134);");
                  alert("brumm.zeigeTacho() = "+brumm.zeigeTacho());
                  brumm.setzeTacho(10);
                  alert("brumm.setzeTacho(10);");
                  alert("brumm.zeigeTacho() = "+brumm.zeigeTacho());

              brummbrumm = new Auto();
                  alert("brummbrumm.tachostand = "+brummbrumm.tachostand); // undefined, da "tachostand" privat ist;
                  alert("brummbrumm.zeigeTacho() = "+brummbrumm.zeigeTacho());
                  brummbrumm.fahren(4221);
                  alert("brummbrumm.fahren(4221);");
                  alert("brummbrumm.zeigeTacho() = "+brummbrumm.zeigeTacho());
                  brummbrumm.setzeTacho(333);
                  alert("brummbrumm.setzeTacho(333);");
                  alert("brummbrumm.zeigeTacho() = "+brummbrumm.zeigeTacho());

              brumm = new AutoProto();
                  alert("brumm.constructor.toString():\n\n"+brumm.constructor.toString());
                  alert("brumm.tachostand = "+brumm.tachostand); // direkter zugriff;
                  brumm.fahren(111);
                  alert("brumm.fahren(111);");
                  alert("brumm.tachostand = "+brumm.tachostand); // direkter zugriff;
                  brumm.tachostand = 222; // direkter zugriff;
                  alert("brumm.tachostand = "+brumm.tachostand); // direkter zugriff;
                  brumm.fahren(111);
                  alert("brumm.fahren(111);");
                  alert("brumm.tachostand = "+brumm.tachostand); // direkter zugriff;

              by(t)e by(t)e - peterS. - pseliger@gmx.net

              --
              sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)

        3. Hallo,

          Trotzdem ist JavaScript _nicht_ für solche Konstrukte geeignet. Es gibt keine selbst definierten Klassen und somit keine selbst definierten Objekte in JavaScript. Eine Funktion bleibt eine Funktion.

          Warum soll sich JavaScript dafür nich eignen?

          BTW, es gibt in JavaScript überhaupt keine Klassen, wie man z.B. auch in diesem Artikel nachlesen kann:
          http://aktuell.de.selfhtml.org/artikel/javascript/oomodell/index.htm

          Mit freundlichen Grüßen,
          Andreas Waidelich

          --
          signatures eat bandwidth
          1. Hallo,

            Warum soll sich JavaScript dafür nich eignen?

            Das ist meine Meinung, resultierend aus Erfahrungen mit schlechtem Speichermanagement.

            BTW, es gibt in JavaScript überhaupt keine Klassen, wie man z.B. auch in diesem Artikel nachlesen kann:

            http://aktuell.de.selfhtml.org/artikel/javascript/oomodell/index.htm
            Hier genau liegt das Problem. Eine Klasse ist der Bauplan für ein Objekt in Bytecode bzw. compiliert. Erst das Objekt selbst liegt als Instanz im Arbeitsspeicher. Nicht mehr benötigte Instanzen werden entfernt bzw. können entfernt werden. So ist das jedenfalls in _richtigen_ OO Programmiersprachen.

            Was macht JavaScript? Alle "Objekte" werden beim Interpretieren der Seite, inclusive aller dort eingebundenen JavaScripte, in den Arbeitsspeicher gesteckt. Erst beim Verlassen der Seite werden sie wieder entfernt. Es gibt keine Möglichkeit des programmierten Speichermanagements. Das mag für kleine Sachen noch irgendwie funktionieren, wirkliche objektorientierte Programmierung ist das aber nicht. Man stelle sich einige "Objekte" mit vorgeladenen Bildern vor. Das Problem ist eben, dass alles was die HTML-Seite an JavaScript braucht, mit der Seite geladen werden muss. Ein "Nachladen" geht nicht.

            viele Grüße

            Axel Richter

  2. Hallo,

    eine alternative:
    Auto={
      tachostand:100,
      fahren:function(weg){
         this.tachostand+=weg;
      }
    }

    document.writeln(Auto.tachostand);
    Auto.fahren(20);
    document.writeln(Auto.tachostand);

    OO mit JS siehe http://developer-x.com/tutorials/oopjs/default.asp

    Mit freundlichen Grüßen,
    Andreas Waidelich

    --
    signatures eat bandwidth
    1. lol das wird ja immer abstruser ;))
      Aber irgendwie goil.
      Lass mich raten hierbei

      Auto={
        tachostand:100,
        fahren:function(weg){
           this.tachostand+=weg;
        }
      }
      wird der auto variable eine anonyme functionsreferenz zugeschrieben und somit das objekt erzeugt? aber das gilt doch dann nur einmal und ist nicht weiter instanzisierbar (gibt es das wort überhaupt)
      aber wobei ich jetzt völlig abdrehe ist die geniale schreibweise von fahren:function ....
      das musst du mir mal ein wenig genauer erklären.

      1. lol das wird ja immer abstruser ;))
        Aber irgendwie goil.
        Lass mich raten hierbei

        Auto={
          tachostand:100,
          fahren:function(weg){
             this.tachostand+=weg;
          }
        }
        wird der auto variable eine anonyme functionsreferenz zugeschrieben und somit das objekt erzeugt?

        so ähnlich. Das Objekt hat keinen Namen, in der Tat, sondern wird direkt zugewiesen.

        Das ist nur eine andere Schreibweise.

        aber das gilt doch dann nur einmal und ist nicht weiter instanzisierbar (gibt es das wort überhaupt)

        Ja.
        das ist das selbe wie:

        function Anonym()
        {
        this.fahren = function(){};
        }

        Auto = new Anonym();

        aber wobei ich jetzt völlig abdrehe ist die geniale schreibweise von fahren:function ....

        ist halt so...

        links von : die Eigenschaft/Methode, rechts der Wert.

        Das selbe geht mit Arrays auch, da nimmst du [] statt {}

        var arr = [8, 7, 89];

        ist dasselbe wie:

        var arr = new Array(8, 7, 89);

        Christian

        1. an dieser stelle nochmals einen fetten dank, an christian.
          *bald komme ich nicht mehr mit dem bedanken hinterher *Gg**

      2. Hallo,

        Die syntax nennt sich object-literal und ähnelt der array-literalen.

        var einAuto={fabrikat:"benz",farbe:"rot"};

        ist fast das gleiche wie

        var einAuto=new Object();
        auto.fabrikat="benz";
        auto.farbe="rot";

        ich gebe zu, dass im falle des autobeispiels die übliche schreibweise via function auto(bla) besser eignet, da man hierbei mehrere objekte von Auto erstellen kann.

        bei "meiner" schreibweise gibt es nur das eine autoobjekt.

        Mit freundlichen Grüßen,
        Andreas Waidelich

        --
        signatures eat bandwidth