peterS.: Mein erster Versuch

Beitrag lesen

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:)