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