XML * XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC * ANT * DIVERSES



Diverses / JavaScript / Objektorientiert programmieren mit JavaScript / Typdeklaration mit this und prototype

Typdeklaration mit this und prototype

Typdeklaration mit this und prototype

➪ Ähnlich flexibel lassen sich auch die Ansätze der objektorientierten Programmierung mit JavaScript umsetzen. Wenn man von der aus C++, Java, oder C# gewohnten klassenbasierten Definition abstrahiert, findet man im Function-Ansatz mit prototype und this ein flexibles, erfrischendes Gegenstück.


var Person = new Function("name", "vorname", 
                          "this.Nachname=name; this.Vorname=vorname;");
Person.prototype.getName = function () { return this.Nachname; };
Person.prototype.getVorname = function () { return this.Vorname; };
var m = new Person("Traumschlos", "Tanja");
console.log("Die Person heisst: " + m.getVorname() + " " + m.getName());
console.log("Direkter Zugriff auf Nachname: " + m.Nachname);
m.Nachname = "Sinnlos";
console.log(m.getVorname() 
            + " hat geheiratet und heisst mit Nachname nun "
            + m.Nachname);

Das Ergebnis:


Die Person heisst: Tanja Traumschlos
Direkter Zugriff auf Nachname: Traumschlos
Tanja hat geheiratet und heisst mit Nachname nun Sinnlos

Zumal die Instanziierung mit 'var m = new Person("Traumschlos", "Tanja");' und die weitere Nutzung durch den "Methodenaufruf" im Wesentlichen geläufig erscheinen dürfte.

Mit prototype und this können öffentlich verfügbare Properties definiert werden, die jeweils unterschiedliche Eigenschaften (Array, Function, komplexer oder primitiver Typ, ...) aufweisen und daher ihrerseits recht komplex werden mögen. Das folgende Beispiel zeigt den Unterschied zwischen prototype und this:


var Mensch = new Function("name", "vorname", 
                          "this.toString = function () {
                           return vorname + \" \" + name
                          };");
// Aufruf mit dem "parametrisierten Konstruktor"
var m = new Mensch("Rielos", "Lotte");
// Verwendung der toString-Function
console.log(m.toString());
console.log("\n1. REFLECTION fuer Objekt m");
for (var p in m) {
  if (m.hasOwnProperty(p)) console.log("\tOwnProperty: " +p);  
  else console.log("\tNOT OwnProperty: " + p);}
striche();
console.log("\n\nÄnderung von name, Keine Übernahme von name in toString()");
m.name="Ruhelos";
console.log(m.toString());
console.log("\n2. REFLECTION fuer Objekt m");
for (var p in m) {
  if (m.hasOwnProperty(p)) console.log("\tOwnProperty: " +p);  
  else console.log("\tNOT OwnProperty: " + p);}
striche();
m.Hobby="Urlaub";
console.log(m.toString() + ", Hobby: " + m.Hobby );
console.log("\n3. REFLECTION fuer Objekt m");
for (var p in m) {
  if (m.hasOwnProperty(p)) console.log("\tOwnProperty: " +p);  
  else console.log("\tNOT OwnProperty: " + p);}
striche();
console.log("\nHobby gilt nur fuer Objekt m, ein anderes Objekt hat kein Hobby");
var x = new Mensch("Hefeklos", "Helga");
console.log(x.toString() + ", Hobby: " + x.Hobby );
striche();
console.log("prototype hilft, 
             das Property Hobby nachträglich für 
             jedes Objekt verfügbar zu machen.");
Mensch.prototype.Hobby = "Lesen";
console.log(m.toString() + ", Hobby: " + m.Hobby );
console.log(x.toString() + ", Hobby: " + x.Hobby );
console.log("\n4. REFLECTION fuer Objekt m");
for (var p in m) {
  if (m.hasOwnProperty(p)) console.log("\tOwnProperty: " +p);  
  else console.log("\tNOT OwnProperty: " + p);}
striche();
console.log(Mensch.prototype); 
console.log(m.prototype);
console.log(m.__proto__);

Das Ergebnis:


Lotte Rielos
1. REFLECTION fuer Objekt m
  OwnProperty: toString
===========================================
Änderung von name, Keine Übernahme von name in toString()
Lotte Rielos
2. REFLECTION fuer Objekt m
  OwnProperty: toString
  OwnProperty: name
===========================================
Lotte Rielos, Hobby: Urlaub
3. REFLECTION fuer Objekt m
  OwnProperty: toString
  OwnProperty: name
  OwnProperty: Hobby
===========================================
Hobby gilt nur fuer Objekt m, ein anderes Objekt hat kein Hobby
Helga Hefeklos, Hobby: undefined
===========================================
prototype hilft, das Property Hobby nachträglich 
für jedes Objekt verfügbar zu machen.
Lotte Rielos, Hobby: Urlaub
Helga Hefeklos, Hobby: Lesen
4. REFLECTION fuer Objekt m
  OwnProperty: toString
  OwnProperty: name
  OwnProperty: Hobby
===========================================
anonymous { Hobby: 'Lesen' }
undefined
anonymous { Hobby: 'Lesen' }

So flexibel das auch erscheinen mag: Der Schutzmechanismus der Datenkapselung fehlt noch, der für streng objektorientierte Programmierer von zentraler Bedeutung ist. Dabei geht es im Kern darum, dafür zu sorgen, dass auf bestimmten Feldern nur klar definierte Werte zulässig sind. Etwa, dass Zahlenwerte nicht negativ sein dürfen oder dass Strings einem bestimmten Pattern entsprechen müssen.

Zu diesem Zweck werden in anderen OO-Sprachen Zugriffsmodifizierer definiert, auf die via Getter lesend und via Setter schreibend zugegriffen wird. Im Setter wird üblicherweise der Schutzmechanismus implementiert.

wg / 6. September 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/javascript2.html