JavaScript – M+T Pocket . Das Programmier-Handbuch (Office Einzeltitel) [Taschenbuch]

8.1
ECMAScript – Einführung

ECMAScript ist eine objektbasierende Sprache, die neben
Objekten mit Methoden und Eigenschaften auch nichtobjektzugeordnete Elemente
wie Funktionen und globale Variablen aufweist. Eine ECMAScript-Objekt ist
einfach eine Sammlung von Eigenschaften mit gewissen Attributen. Eigenschaften
einen Container, der andere Objekte, primitive Werte oder Methoden
einhalten kann. Ein primitiver Wert ist einer der folgenden Built-in-Typen (Built-in bedeutet, dass ein Element in der Sprache an jeder – sinnvollen – Stelle
zur Verfügung steht):


Undefined


Null


Boolean


Number

String

Ein Objekt ist ein Mitglied von dem so genannten
Built-in-Typ Object und
eine Methode ist eine einem Objekt über eine Eigenschaft zugeordnete Funktion.
Built-in-Objekte ein Kernaspekt von ECMAScript, um zahlreiche Leistungen
der Sprache überhaupt realisieren zu können. Sie sind wie gesagt das, was
sozusagen in der Scriptsprache immer zur Verfügung steht. Also das, was Sie
immer verwenden können bzw. vom System verwendet wird. Konkret sind das die
Objekte


Global


Object


Function


Array


String


Boolean


Number


Math


Date


RegExp

sowie die Fehlerobjekte


Error


EvalError


RangeError


ReferenceError


SyntaxError


TypeError


URIError

ECMAScript definiert dazu einen Satz von so genannten
Built-in-Operatoren. Diese realisieren die diversen Operationsmöglichkeiten der
Sprache. Im Detail sind das

einstellige Operationen

multiplikative Operationen

additive Operationen

bitweise Verschiebungen

relationale Operationen

Vergleichsoperationen

binäre bitweise Operationen

binäre logische Operationen

Zuweisungsoperationen

sowie eine Trennung über den Komma-Operator.

Die Syntax von ECMAScript ist stark an der Java-Syntax
angelehnt, aber erleblich in der Strenge zurückgenommen, um eine leichtere
Handhabung zu gewährleisten. So muss eine Variable beispielsweise nicht im Typ
deklariert werden, was ja im Rahmen der Datentypen von JavaScript schon
mehrfach zur Sprache kam.

In Bezug auf Objektorientierung
beinhaltet ECMAScript keine Klassenstrukturen in dem Sinn, wie es C++,
Smalltalk, oder Java besitzen. Allerdings werden Konstruktoren zum Erstellen
von Objekten bereitgestellt. Alle Konstruktoren sind als Objekte zu verstehen,
die selbst wieder durch die Ausführung ihres Codes Objekte erzeugen und
initialisieren. Insbesondere beinhaltet jeder Konstructor eine
Prototype-Eigenschaft, um Prototype-basierende Vererbung und gemeinsame
Eigenschaften zu implementieren. Konkret erstellt werden Objekte unter
ECMAScript über Konstruktoren in Verbindung mit dem Schlüsselwort new erzeugt (wie
auch in diversen anderen OO-Sprachen – beispielsweise Java). Etwa erstellt

new
String("Das gibt es doch gar nicht")

ein String-Objekt.
Aber es geht auch anders, wobei das Konsequenzen hat. Man kann einen
Konstruktor auch ohne das Schlüsselwort new aufrufen. Was dann aber passiert,
hängt am Konstruktor. Die Syntax

String("Das
gibt es doch gar nicht")

erzeugt einen primitiven String, aber kein Objekt. Hier
fungiert String()
als gewöhnliche Funktion.

Wie aus den letzten Ausführungen schon anzunehmen,
unterstüzt ECMAScript Prototyping und prototype-basierende Vererbung. Jeder
Konstructor besitzt einen zugeordente Prototyp und jedes mit einem Konstruktor
erzeugtes Objekt beinhaltet eine implizite Referenz auf diesen Prototyp.
Darüber hinaus besitzt ein Prototyp bei Bedarf eine implizite, nichtleere auf
Referenz auf seinen eigenen Prototype usw. Das nennt man eine Prototype-Kette.
Aber was bisher nicht näher erläutert wurde ist, was Prototyping überhaupt
bedeutet.

8.1.1
Prototyping

ECMAScript und damit auch JavaScript bietet in neuen
Versionen die Möglichkeit, nachdem ein Objekt bereits mit new definiert
wurde, es nachträglich um neue Eigenschaften und Methoden zu erweitern. Das
JavaScript-Schlüsselwort für diesen Zweck heisst prototype. Allgemeine Syntax dazu ist die folgende:

[Objekttyp].prototype.[Eigenschaft] = [Wert];

bzw.

[Objekttyp].prototype.[Methode] = [Methode];

Sobald diese Aktion durchgeführt wurde, besitzen alle
zukünftigen, aber auch alle vorherigen Objekte die neue Eigenschaft bzw.
Methode. Insbesondere ist zu beachten, dass nach der prototype-Anweisung erzeugte Objekte für
die zugefügte Eigenschaft immer den über prototype angegebenen Wert besitzen. Ein
Erweitern der Konstruktormethode um die Eigenschaft wird zwar keinen
Laufzeitfehler erzeugen, und auch die Eigenschaft wird bereitgestellt
(allerdings wegen prototype),
aber der Wert ist der, der bei der prototype-Zuweisung vergeben wurde. Er
muss explizit mit einer Zuweisung verändert werden. Das nachfolgende Beispiel
zeigt dies. Wir verwenden bei diesem Beispiel ein selbstdefiniertes Objekt, das
mit Prototyping erweitert wird. Zu der Erstellung von
selbstdefinierten Objekten siehe Seite
203.

<HTML>

<SCRIPT language="JavaScript">

function tier(typ, fell, schwanz){

this.typ = typ;

this.fell = fell;

this.schwanz = schwanz;

}

var tier1 = new
tier("Hund",true,true);

document.write("Eigenschaften von dem Objekt:
");

document.write(tier1.typ.toString());

document.write("<br>");

document.write(tier1.fell);

document.write("<br>");

document.write(tier1.schwanz);

document.write("<P>");

tier.prototype.besitzer = "Hans
Dampf";

document.write("Besitzer ist ");

document.write(tier1.besitzer);

document.write("<P>");

var tier2 = new
tier("Katze",true,true,"Willi Wüst");

document.write("Besitzer Tier 2 ? ");

document.write(tier2.besitzer);

document.write("<P>");

document.write("Besitzer Tier 2 ? ");

tier2.besitzer = "Willi Wüst";

document.write(tier2.besitzer);

document.write("<P>");

document.write("Besitzer Tier 1 ? ");

document.write(tier1.besitzer);

</SCRIPT>

<BODY></BODY>

</HTML>

Listing 8.1: Veränderung mit prototype