CSS, HTML und Javascript mit {stil}

Funktionen als Konstruktoren von Objekten

constructor

Für die Initialisierung eines mit new erzeugten Objekts kann auch eine Funktion benutzt werden. Wenn eine Funktion mit dem new-Operator aufgerufen wird, spricht man von einem Konstruktor oder einer Konstruktor-Funktion.

Eine Konstruktor-Funktion bündelt nicht nur Anweisungen, um den Code übersichtlicher zu gestalten, sondern initialisiert darüber hinaus das Objekt.

function Obj(x, y) {
   this.x = x;
   this.y = y;
}

var myObj = new Obj(a, b);
Schritt 1   function Mitarbeiter(firstName, lastName, email) {
                this.firstName = firstName;
                this.lastName  = lastName;
                this.email     = email;
            }

Schritt 2   var mitarb = new Mitarbeiter("Hein","Meier","h.meier@net.de");

Es ist gängige Praxis (Programmierkonvention), die Namen von Objekten mit einem Großbuchstaben zu beginnen.

  • Das Schlüsselwort function erzeugt eine Funktion mit dem Name Mitarbeiter
  • Der Funktion werden die Parameter zugewiesen: firstName, lastName und email.
  • Den Parametern werden Eigenschaften mit demselben Namen durch das Schlüsselwort this zugewiesen.

this

Innerhalb der Konstruktor-Funktion werden die Elemente des Objekts mit dem Schlüsselwort-Präfix this angesprochen. this verweist auf die aktuelle Instanz und fügt dem Objekt Eigenschaften hinzu oder modifiziert sie.

Außerhalb der Funktion erfolgt der Zugriff wie zuvor mit dem Objektnamen als Präfix gefolgt von einem Punkt gefolgt von einem Element:

Schritt 3   var name = mitarb.lastName; 

Während die Variablen einer Standard-Funktion außerhalb der Funktion nicht sichtbar sind, gibt der Punkt-Operator außerhalb der Funktion Zugriff auf die Eigenschaften eines Objekts.

Eine Konstruktor-Funktion ist nicht auf das Zusammenfassen von Elementen eines Objekts beschränkt, sondern kann auch Anweisungen enthalten, z.B. um eine komplexere Initialisierung durchzuführen.

function Mitarbeiter(persNr) {
   this.persNr = persNr;
   ...
   var mydate  = new Date();	
   this.alter  = mydate.getFullYear() - parseInt(this.persNr.substring(2,6));
}

var mitarb = new Mitarbeiter('0119601234');
alert(mitarb.alter);

Mit this deklarierte Elemente werden als öffentliche (public) Elemente bezeichnet.

private und public

Wird innerhalb des Funktions-Konstruktors eine Variable durch das Schlüsselwort var deklariert, ist diese Variable wie gewohnt nur innerhalb der Funktion bekannt und wird auch als privates (privat) Element bezeichnet.

Private Mitglieder werden vom Constructor erzeugt. Normale Variablen und Parameter des Constructors sind private Mitlgieder.

function Adress(firstName, lastName, city)
{
   this.firstName = firstName;
   this.lastName  = lastName; 
   this.city      = city;
   var passwort   = "geheim";
   var self       = this; 
}

Der Konstruktor legt zwei private Instanzvariablen an: passwort und self. Sie gehören zum Objekt, aber außerhalb des Objekts kann nicht auf diese Instanzvariablen zugegriffen werden und auch die public-Methoden des Objekts haben keinen Zugriff. Nur die privaten Methoden – das sind die inneren Funktionen des Constructors – können auf private Instanzvariablen zugreifen.

Die private Variable self ist eine Programmierkonvention. Sie wird gebraucht, um das Objekt den privaten Methoden zur Verfügung zu stellen und ist ein Workaround für einen Fehler in der ECMAScript Language Specification, der this in inneren Funktionen falsch belegt.

function Adress(firstName, lastName, city) {
    this.firstName = firstName;
    this.lastName  = lastName; 
    this.city      = city;
       
    this.email     = buildEmail();
    var passwort   = "geheim";
    var self       = this;
      
    function buildEmail() {
        return firstName + '.' + lastName + '@' + 'ivent.de';
    }
}
   
Adress.prototype.print = function(firstName, lastName) {
    var body = document.getElementsByTagName("body")[0];
    var line = document.createElement('div');
    line.innerHTML = this.firstName + " " +  this.lastName + " " + this.email;
    body.appendChild(line);
}
   
/** H A U P T P R O G R A M M */
window.onload = function () {
   var adressA   = new Adress("Tina", "Meier", "Langdorf", "tina@www.de");
   adressA.print("Tina", "Meier");
   var adressB = new Adress("Heini", "Meier", "Augsburg", "meier@www.de");
   adressB.print(Adress.firstName, Adress.lastName);
}

Die private Methode buildEmail() baut einen Email-String aus Namen und Vornamen und einem Domainnamen. Private Methoden können nicht aus public-Methoden aufgerufen werden. Darum gibt es für eine Instanzvariable email, die auf die Ergebnisse der privaten Methode zugreift.