„JavaScript“ – Versionsunterschied
[gesichtete Version] | [gesichtete Version] |
→Eigene Objekte definieren: objektliteral |
→Datentypen: überarbeitet, fokus weg von den vordefinierten konstruktoren und hin zu typeof |
||
Zeile 151: | Zeile 151: | ||
=== Datentypen === |
=== Datentypen === |
||
Der [[Datentyp]] einer Variablen v läßt sich mit <code>typeof v</code> ermitteln. |
|||
Die vordefinierten Prototypen korrespondieren teilweise mit grundlegenden [[Datentyp]]en. Zeichenketten haben den Typ <code>String</code>, numerische Werte den Typ <code>Number</code> und boolesche Werte den Typ <code>Boolean</code>. Des Weiteren gibt es die Typen <code>null</code> und <code>undefined</code>. Dieses sind sogenannte ''einfache Werte'' (''primitive values''). Alle anderen Werte sind ''Objekte'' (''objects'') |
|||
und haben den Typ <code>Object</code>. Funktionen, Arrays, Datumsobjekte und reguläre Ausdrücke sind so gesehen spezielle Objekte. |
|||
Zeichenketten haben den Typ <code>string</code>, numerische Werte den Typ <code>number</code> und boolesche Werte den Typ <code>boolean</code>. |
|||
Beim direkten Notieren von Zeichenketten, Zahlen oder booleschen Variablen entstehen einfache Werte (zum Beispiel bei <code>var variable = "Beispieltext";</code>). Beim Nutzen der jeweiligen Konstruktorfunktionen hingegen entstehen Objekte (z. B. bei <code>var variable = new String("Beispieltext");</code>). |
|||
Ein Sonderfall ist der Typ <code>undefined</code> mit <code>undefined</code> als einzigem Wert. |
|||
Funktionen sind Objekte, der typeof-Operator gibt als Typ aber <code>function</code> zurück. |
|||
Alle anderen Werte - reguläre Ausdrücke, Arrays und der Wert <code>null</code> inbegriffen - sind vom Typ <code>object</code>. |
|||
Mit den vordefinierten Konstruktorfunktionen String, Number, Boolean erstellte Variablen verhalten sich wie Werte der entsprechenden Datentypen - der <code>typeof</code>-Operator gibt jedoch "object" zurück: |
|||
<source lang="javascript"> |
|||
var variable = "Beispieltext"; |
|||
alert(typeof variable); // ergibt "string" |
|||
variable = new String("Beispieltext"); |
|||
alert(typeof variable); // ergibt "object" |
|||
</source> |
|||
JavaScript ist [[Dynamische Typisierung|dynamisch typisiert]], d. h. der Datentyp einer Variablen kann sich während der Ausführung eines Scripts ändern, was manchmal zu Fehlern bzw. unerwünschten Effekten führt. |
JavaScript ist [[Dynamische Typisierung|dynamisch typisiert]], d. h. der Datentyp einer Variablen kann sich während der Ausführung eines Scripts ändern, was manchmal zu Fehlern bzw. unerwünschten Effekten führt. |
Version vom 21. November 2009, 18:16 Uhr
JavaScript | |
---|---|
![]() | |
Basisdaten | |
Paradigmen: | multiparadigmatisch |
Erscheinungsjahr: | 1995 |
Designer: | Brendan Eich |
Entwickler: | Brendan Eich |
Aktuelle Version: | 1.8 (2008) |
Typisierung: | schwach, dynamisch, duck |
Wichtige Implementierungen: | SpiderMonkey, Rhino, SquirrelFish, V8 |
Beeinflusst von: | Self, C, Scheme, Perl, Python, Java |
www.ecma-international.org/publications-and-standards/standards/ecma-262/ |
JavaScript ist eine Skriptsprache, die hauptsächlich für das DOM-Scripting in Web-Browsern eingesetzt wird. Dabei ist unter JavaScript die Gesamtheit aus den Eigenschaften des Browsers (beziehungsweise Clients oder Scripting-Hosts) sowie des Document Object Models (DOM) und des Sprachkerns zu verstehen.
Der als ECMAScript (ECMA 262) standardisierte Sprachkern von JavaScript beschreibt eine moderne, schlanke, dynamisch typisierte, objektorientierte, aber klassenlose Skriptsprache, die dennoch allen objektorientierten Programmierparadigmen unter anderem auch – aber eben nicht ausschließlich – auf der Basis von Prototypen gerecht wird. In JavaScript lässt sich sowohl prozedural als auch rein funktional bzw. objektorientiert programmieren.
Während HTML/CSS nur rudimentäre Möglichkeiten zur Nutzerinteraktion bietet, können mit JavaScript Inhalte generiert und nachgeladen werden, was Webanwendungen erst möglich bzw. praktikabel macht.
Entwicklung
Die Syntax von JavaScript ähnelt jener der C-Abkömmlinge, wozu auch Java gehört. Trotz der Namens- und syntaktischen Ähnlichkeit hat JavaScript nur geringe Gemeinsamkeiten mit Java, beispielsweise wird Objektorientierung in JavaScript anders als in Java nicht durch Klassen, sondern durch Prototypen unterstützt.
Von Brendan Eich zuerst „Mocha“ genannt, wurde die Sprache aus Marketinggründen erst in „LiveScript“ und letztendlich in „JavaScript“ umbenannt: Um dem damals aktuellen Java-Trend zu entsprechen, entstand mit LiveConnect eine Schnittstelle zwischen Java und „LiveScript“, was sich im neuen Namen „JavaScript“ ausdrücken sollte.[1] „JavaScript“ ist eine Marke des Unternehmens Sun Microsystems.[2]
Ursprünglich für den Netscape Navigator entwickelt, finden sich heute nach dem sogenannten Browserkrieg mittlerweile in praktisch allen grafischen Browsern weitgehend kompatible JavaScript-Interpreter wie z. B. SpiderMonkey für Mozilla/Gecko oder JScript von Microsoft. Der Sprachkern von JavaScript ist unter dem Namen ECMAScript durch Ecma International standardisiert. Der in Java implementierte JavaScript-Interpreter Rhino wird ab Version 6.0 als Teil der Java-Laufzeitumgebung standardmäßig mitgeliefert.[3]
Inzwischen hat sich die Sprache auch neue Anwendungsgebiete erschlossen. Zum Beispiel wird sie gerne als Skriptsprache für Spiele und Anwendungsprogramme eingesetzt, da der Sprachkern nur wenige Objekte enthält und dadurch der zur Ausführung von in JavaScript formulierten Skripten erforderliche Interpreter relativ klein gehalten werden kann.
Überblick
JavaScript wird hauptsächlich clientseitig eingesetzt und unterscheidet sich so von anderen im Web verwendeten Sprachen, wie Perl oder PHP, die ausschließlich serverseitig eingesetzt werden. JavaScript bzw. die ECMAScript-Implementationen finden jedoch beispielsweise auf Netscape Enterprise Servern (NES), und als JScript bzw. JScript.NET in einer ASP- bzw. ASP.NET-Umgebung auf Microsoft Internet Information Services auch serverseitig Anwendung (Stichwort Server-Side JavaScript). Weitere Beispiele für serverseitige Javascript-Programmierung sind POW und Jaxer, die auf der Mozilla-Javascript-Engine Spidermonkey aufsetzen.
JavaScript wurde ursprünglich von Sun Microsystems und Netscape in Kooperation entwickelt. Trotz des ähnlichen Namens und einer ähnlichen Syntax ist JavaScript grundlegend verschieden von der Programmiersprache Java, die von Sun Microsystems stammt. Die Namensgleichheit erklärt sich wohl vor allem aus der Absicht, aus Marketinggründen eine Verbindung mit den damals sehr populären Java-Applets herzustellen. Die Syntax wurde auch aus diesem Grund weitgehend der von Java angeglichen.
Die ursprüngliche Grundfunktionalität von JavaScript ist heute als ECMAScript oder ECMA-262 standardisiert und wird von den meisten Browsern weitgehend unterstützt (JavaScript in der Version 1.5 entspricht ECMA-262 Version 3).
Typische Anwendungsgebiete
Typische Anwendungsgebiete von JavaScript sind:
- Plausibilitätsprüfung (Validierung) von Formulareingaben beim Absender
- Mehrere Frames auf einmal wechseln oder die Seite aus dem Frameset „befreien“
- Banner oder Laufschriften
- Dynamische Manipulation von Webseiten über das Document Object Model
- Senden und Empfangen von Daten, ohne dass der Browser die Seite neu laden muss (Ajax)
- sofortiges Vorschlagen von Suchbegriffen
- Verschleierung von E-Mail-Adressen zur Bekämpfung von Spam (siehe den betreffenden Artikel).
Missbrauch
Einige Anwendungen, die mit JavaScript möglich sind, verärgern meistens den Benutzer und werden als „schlechter Stil“ angesehen:
- Quelltext „verschleiern“, um diesen vor dem Besucher zu verstecken
- Verschleiern von Internetadressen, auf die ein Link verweist
- Deaktivieren des Kontextmenüs, um zu erschweren, dass Bilder oder die gesamte Seite abgespeichert werden können
- Deaktivieren der Kopierfunktion, um zu erschweren, dass Texte oder Bilder kopiert werden können
- Unaufgeforderte (Werbe-)Pop-ups oder Pop-unders
- Ungewolltes Öffnen von Fenstern, teilweise auch Öffnen beliebig vieler Fenster
- Ungewolltes Schließen des Browserfensters
- Ungewollte Größenänderung des Browserfensters
- Blockieren der Anwender mit zahllosen aufeinanderfolgenden Dialogfenstern
- Bei anfälligen Webanwendungen kann JavaScript auch von Dritten missbraucht werden, etwa per XSS (Codeeinschleusung).
- JavaScript-Navigation: Barrierearme Webseiten zeichnen sich dadurch aus, dass sie auch bei abgeschaltetem JavaScript möglichst uneingeschränkt navigierbar bleiben. Oft schränkt das nicht aktivierte JavaScript die Benutzbarkeit einer Webseite ein.
Geschichte
Am 18. September 1995 veröffentlicht Netscape mit der Vorversion des Navigator 2.0 einen Browser mit einer eingebetteten Skriptsprache, die zu diesem Zeitpunkt LiveScript heißt und von Brendan Eich entwickelt wurde. Die Sprache kann u. a. Formulareingaben des Benutzers vor dem Absenden überprüfen. Am 4. Dezember 1995 verkünden Netscape und Sun Microsystems eine Kooperation die die Interaktion von LiveScript direkt mit Java-Applets zum Ziel hat. Sun entwickelte die nötigen Java-Klassen, Netscape die Schnittstelle LiveConnect und benennt die Sprache in JavaScript um (JavaScript 1.0).
Mit der ersten Beta-Version des Navigator 3.0 führt am 29. April 1996 Netscape JavaScript 1.1 ein. Neu ist die Möglichkeit, auf Bilder zuzugreifen und so genannte Rollover-Grafiken zu erstellen. LiveConnect ist jetzt Bestandteil des Browsers. Mit der Beta-Version des Internet Explorer 3 stellt im Mai 1996 Microsoft seinen ersten JScript-fähigen Browser vor. Beginn des Browserkriegs. Mit der Ankündigung des Netscape Communicators wird JavaScript 1.2 am 15. Oktober 1996 veröffentlicht, der Netscape Communicator 4.0 mit JavaScript 1.2 erscheint jedoch erst am 4. Juni 1997. Ebenfalls im Juni 1997 veröffentlicht die „European Computer Manufacturers Association“ ihren Standard ECMA-262 (ECMAScript), der zusammen mit Netscape entwickelt wurde und die Grundelemente einer Skriptsprache standardisieren soll. Diese wird im April 1998 zur ISO-Norm ISO/IEC 16262:1998 Information technology – ECMAScript language specification. Am 1. Oktober 1997 kommt der Internet Explorer 4 heraus, der den Sprachumfang von JavaScript 1.1 abdeckt. Darüber hinaus werden eigene Erweiterungen veröffentlicht, die zu Kompatibilitätsunterschieden zwischen Navigator und Internet Explorer führen und eine DOM-ähnliche Syntax zur Verfügung stellen, die es ermöglicht, auf alle Elemente der Webseite zuzugreifen und diese beliebig zu verändern.
Im Juli 1998 kommt mit der Beta-Version des Netscape Communicators 4.5 JavaScript 1.3. Erstmals zu finden war diese JavaScript-Version schon in der Version 4.06 des Netscape Communicators.
Im Oktober 1998 stellt Netscape JavaScript 1.4 vor. Diese Version ist vollständig kompatibel mit ECMA-262. Ein Browser mit der Unterstützung dieser Version erscheint jedoch nicht.
Im April 2000 kommt mit der Preview Release 1 des Navigator 6 JavaScript 1.5 und DOM Level 1. Am 5. Juni 2002 erscheint Mozilla 1.0 mit JavaScript 1.5, am 29. November 2005 Mozilla Firefox 1.5 mit JavaScript 1.6, am 12. Juli 2006 Mozilla Firefox 2.0b1 mit JavaScript 1.7. und am 18. Dezember 2007 Mozilla Firefox 3.0b2 mit JavaScript 1.8.
Versionsgeschichte
Version | Release | Entsprechung | Netscape Navigator | Mozilla Firefox | Internet Explorer | Opera | Safari | Google Chrome |
---|---|---|---|---|---|---|---|---|
1.0 | März 1996 | 2.0 | 3.0 | |||||
1.1 | August 1996 | 3.0 | ||||||
1.2 | Juni 1997 | 4.0-4.05 | ||||||
1.3 | Oktober 1998 | ECMA-262 1st edition / ECMA-262 2nd edition | 4.06-4.7x | 4.0 | ||||
1.4 | Netscape Server | |||||||
1.5 | November 2000 | ECMA-262 3rd edition | 6.0 | 1.0 |
|
|
||
1.6 | November 2005 | 1.5 + Array extras + Array & String generics + E4X | 1.5 |
|
||||
1.7 | Oktober 2006 | 1.6 + Pythonic generators + Iterators + let | 2.0 |
|
1.0 | |||
1.8 | Juni 2008 | 1.7 + Generator expressions + Expression closures | 3.0 | |||||
1.8.1 | 1.8 + geringfügige Updates | 3.5 | ||||||
1.9 | 1.8.1 + ECMAScript 5 Compliance | 4 |
Sicherheit
Das Sandbox-Prinzip
JavaScript wird in einer so genannten Sandbox ausgeführt, die sich im Browser befindet. Dieses bewirkt, dass JavaScript im Allgemeinen nur Zugriff auf die Objekte des Browsers hat und somit nicht auf das Dateisystem zugreifen und Dateien lesen oder schreiben kann. Es ist jedoch zumindest in JScript möglich, bei entsprechenden Sicherheitseinstellungen durch die Nutzung von ActiveX diese Beschränkungen zu umgehen.
Es bewirkt ferner, dass Aktionen wie das Schließen des Browserfensters, das Aus- und Einblenden von Symbolleisten, das Ändern der im Browser eingestellten Startseite oder das Auslesen der zuletzt besuchten Webseiten des Anwenders die explizite Erlaubnis des Benutzers erfordern.
Deaktivieren von JavaScript
In fast allen JavaScript-fähigen Browsern lässt sich JavaScript abschalten oder lassen sich einzelne Aktionen, wie die Änderung des Textes in der Statusleiste oder die Manipulation von Browserfenstern, deaktivieren.
Sprachelemente
Vordefinierte Objekte
JavaScript kennt mehrere eingebaute Objekte, die von ECMAScript definiert werden.
- Das namenlose globale Objekt, das alle Variablen und Objekte enthält.
Object
als allgemeiner Prototyp, von dem alle Objekte abgeleitet sindFunction
als Prototyp für FunktionenArray
als Prototyp für ArraysString
als Prototyp für ZeichenkettenBoolean
als Prototyp für Boolesche VariablenNumber
als Prototyp für Zahlen (64-Bit-Gleitkommazahlen gemäß IEEE 754)Math
stellt Konstanten und Methoden für mathematische Operationen bereit.Math
kann nicht als Konstruktor dienen.Date
für Operationen mit Daten bzw. Zeitpunkten und DatumsformatenRegExp
für reguläre Ausdrücke
Die restlichen Objekte, die beim clientseitigen JavaScript verwendet werden, entstanden historisch vor allem durch die Netscape-Spezifikationen (window
, document
usw.). Das window
-Objekt selbst ist dabei de facto das globale Objekt, indem einfach einer Variablen window
das globale Objekt zugewiesen wurde. Zahlreiche Unterobjekte von document
wurden mittlerweile durch DOM HTML standardisiert (title
, images
, links
,
forms
usw.). Aktuelle Browser unterstützen zudem DOM Core und andere W3C-DOM-Standards sowie Erweiterungen von Microsoft JScript.
Datentypen
Der Datentyp einer Variablen v läßt sich mit typeof v
ermitteln.
Zeichenketten haben den Typ string
, numerische Werte den Typ number
und boolesche Werte den Typ boolean
.
Ein Sonderfall ist der Typ undefined
mit undefined
als einzigem Wert.
Funktionen sind Objekte, der typeof-Operator gibt als Typ aber function
zurück.
Alle anderen Werte - reguläre Ausdrücke, Arrays und der Wert null
inbegriffen - sind vom Typ object
.
Mit den vordefinierten Konstruktorfunktionen String, Number, Boolean erstellte Variablen verhalten sich wie Werte der entsprechenden Datentypen - der typeof
-Operator gibt jedoch "object" zurück:
var variable = "Beispieltext";
alert(typeof variable); // ergibt "string"
variable = new String("Beispieltext");
alert(typeof variable); // ergibt "object"
JavaScript ist dynamisch typisiert, d. h. der Datentyp einer Variablen kann sich während der Ausführung eines Scripts ändern, was manchmal zu Fehlern bzw. unerwünschten Effekten führt.
Zugriff auf Objekteigenschaften und -methoden
Eigenschaften und Methoden von Objekten werden über folgende Notation angesprochen:
objekt.eigenschaft
bzw.
objekt.methode([Parameter])
Allen Objekten können zur Laufzeit neue Eigenschaften und Methoden hinzugefügt werden. In diesem Beispiel wird eigenschaftA
mit 1 belegt:
objekt.eigenschaftA = 1;
Eigenschaften können auch in der folgenden Form angesprochen werden, wobei der Eigenschaftsname als Zeichenkette angegeben wird:
objekt["eigenschaftA"] = 1;
Durch diese Schreibweise können alle Eigenschaften eines Objektes in einer For … in-Schleife durchlaufen werden. In diesem Beispiel wird „objekt.eigenschaftA = 1“ ausgegeben.
for (var eigenschaftsname in objekt) {
window.alert("objekt." + eigenschaftsname + " = " + objekt[eigenschaftsname]);
}
Entfernen lassen sich Eigenschaften mit dem Operator delete
:
delete objekt.eigenschaftA;
Kontrollstrukturen
If … else (Bedingte Anweisung)
if (bedingung) {
anweisungen;
} else {
anweisungen;
}
Switch-Kontrollstruktur
switch (variable) {
case wert1 :
anweisungen;
break;
case wert2 :
anweisungen;
break;
default :
anweisungen;
}
while (bedingung) {
anweisungen;
}
do {
anweisungen;
} while (bedingung);
for (startausdruck; bedingung; iterationsausdruck) {
anweisungen;
}
For … in-Schleife
Mit dieser Anweisung werden alle eigenen und ererbten Eigenschaften eines Objektes durchlaufen, die nicht die interne Eigenschaft DontEnum aufweisen. DontEnum gilt für bestimmte eingebaute Eigenschaften und kann nicht vom Benutzer gesetzt werden.[5] Bei jedem Schleifendurchgang wird einer angegebenen Variable der Eigenschaftsname zugewiesen.
for (var eigenschaftsname in objekt) {
anweisungen;
}
For Each … in-Schleife
Die For Each … in-Schleife gleicht der For … in-Schleife, mit dem Unterschied, dass die Eigenschaftswerte des Objekts durchlaufen werden und nicht deren Namen. Sie ist erst ab JavaScript 1.6 verfügbar. [6]
for each (var eigenschaftswert in objekt) {
anweisungen;
}
Funktionen
Funktionen sind in JavaScript vollwertige Objekte. Sie haben Methoden und Eigenschaften, können erstellt und überschrieben, als Argumente an Funktionen übergeben und von ihnen erzeugt und zurückgegeben werden. Im letzteren Fall entsteht eine Closure (auch Funktionsabschluss genannt), mit der beispielsweise Datenkapselung umgesetzt werden kann.
Nicht jedes Argument einer Funktion muss beim Aufruf angegeben werden, für fehlende Argumente wird der Wert undefined gesetzt. Außerdem kann innerhalb der Funktion auch über das arguments
-Objekt auf die Argumente zugegriffen werden.
Es gibt mehrere Möglichkeiten, in JavaScript Funktionen zu erzeugen[7]:
// 1: Funktionsdeklaration, a ist eine Funktion mit dem Namen a.
function a (Parameter1, Parameter2, Parameter3) {
anweisungen;
return ausdruck;
}
// 2: Funktionsausdruck ('function expression')
// 2.1: Normalfall, b ist eine anonyme Funktion
var b = function (...) {...}
// 2.2: benannter Funktionsausdruck ('named function expression')
// c ist hier eine Funktion mit dem Namen d. Außerhalb der
// Funktion ist sie mit c ansprechbar, innerhalb mit c und d.
var c = function d (...) {...}
// 3: Function-Konstruktor
var e = new Function('arg1', 'arg2', 'return arg1 + arg2');
// 4: 'expression closure' aus JavaScript 1.8, ähnlich dem Lambda-Kalkül
// kommt ohne geschweifte Klammern und return aus, gibt das Ergebnis von Ausdruck zurück
function f (...) ausdruck;
Eine funktionale Implementation des Euklidischen Algorithmus in der rekursiven Variante sähe so aus (JavaScript 1.8):
// einfache Version
function euklid (a, b)
b ? euklid(b, a%b) : a
// Version, die beliebig viele Argumente annimmt,
// rekursiv, funktional
// Ablauf:
// (1) Erzeuge ein Array aus den Argumenten von ggT
// (2) Wenn ggT nur (noch) ein Argument hat, gib dieses zurück, wenn es keines hat, 0
// (3) sonst rufe euklid mit dem ersten Argument
// (4) und dem Ergebnis des Ergebnisses von ggT mit den Argumenten 2 bis n auf
function ggT ()
(function (args)
!args[1]
? (function () args[0] || 0) // (2)
: (function () euklid( // (3)
args[0],
ggT.apply(null, args.slice(1))() // (4)
))
)(Array.prototype.slice.apply(arguments)) // (1)
ggT(4,6); // ergibt eine Funktion, die 2 zurückgibt
// die zurückgegebene Funktion kann auch direkt ausgeführt werden:
ggT()(); // 0
ggT(4)(); // 4
ggT(4,6,8,102,244)(); // 2
Eigene Objekte definieren
Objektliterale
Objekte können in JavaScript direkt anhand ihrer Attribute definiert werden:
var meinObjekt = {
zahl: 42,
gibZahl: function () {
return meinObjekt.zahl;
}
};
Konstruktor-Funktionen
Eine JavaScript-Funktion kann dazu genutzt werden, um ein mit new
erstelltes Objekt zu initialisieren. In diesem Fall spricht man von einem Konstruktor oder einer Konstruktor-Funktion. Innerhalb dieser Funktion kann das neue Objekt über die Variable this
angesprochen werden. Darüber können dem Objekt Eigenschaften angehängt werden.
function MeinObjekt(x) { // Konstruktor
this.zahl = x;
}
var objekt = new MeinObjekt(3); // Instanz erzeugen
window.alert(objekt.zahl); // per Meldefenster ausgeben (3)
Im Beispiel wurde dem Objekt eine Eigenschaft vom Typ Number
, d. h. eine Zahl angehängt. Erlaubt sind Eigenschaften jedes möglichen Typs, darunter auch Funktionen. Objektmethoden sind somit nur spezielle Eigenschaften vom Typ function
.
Öffentliche und private Methoden und Eigenschaften
Beim Definieren eigener Prototypen können Eigenschaften und Methoden entweder als öffentlich oder als privat notiert werden. Diese Unterscheidung bezieht sich auf ihre Verfügbarkeit, das heißt aus welchem Kontext der Zugriff erlaubt ist. Private Eigenschaften können nur aus der Konstruktor-Funktion und aus objekteigenen Methoden heraus gelesen und geschrieben werden. Der Zugriff von außerhalb des Objekts ist nur bei öffentlichen Eigenschaften möglich. Dementsprechend können öffentliche Methoden – die letztlich nur besondere Eigenschaften sind – aus jedem Kontext heraus, in dem das Objekt verfügbar ist, ausgeführt werden. Private Methoden sind analog nur objektintern aufrufbar.
Methoden werden zudem anhand ihrer Zugriffsrechte auf objekteigene Eigenschaften und Methoden unterschieden. Private Methoden haben prinzipiell Zugriff auf alle öffentlichen und privaten Eigenschaften und Methoden. Dasselbe gilt für sogenannte privilegierte öffentliche Methoden. Nicht-privilegierte öffentliche Methoden können nur auf öffentliche Eigenschaften und Methoden zugreifen. Erstgenannte werden innerhalb der Konstruktor-Funktion definiert, letztgenannte werden von außen über die Eigenschaft prototype
der Konstruktor-Funktion hinzugefügt (siehe den folgenden Abschnitt).
Im folgenden Beispiel werden die verschiedenen Eigenschafts- und Methodentypen demonstriert.
function MeinObjekt (parameter) {
/* parameter ist eine private Eigenschaft */
/* Speichere eine Referenz auf das aktuelle Objekt in
der privaten Eigenschaft self */
var self = this;
/* private Eigenschaft */
var private_eigenschaft = "privat";
/* öffentliche Eigenschaft */
this.oeffentliche_eigenschaft = "öffentlich";
/* private Methode */
var private_methode = function () {
window.alert(private_eigenschaft + " " + self.oeffentliche_eigenschaft);
};
/* privilegierte öffentliche Methode */
this.privilegierte_methode = function () {
window.alert(private_eigenschaft + " " + this.oeffentliche_eigenschaft);
private_methode();
};
}
/* nicht-privilegierte öffentliche Methode */
MeinObjekt.prototype.oeffentliche_methode = function () {
window.alert(typeof(private_eigenschaft) + " " + typeof(private_methode));
window.alert(this.oeffentliche_eigenschaft);
};
Neue Instanz erstellen:
var objekt = new MeinObjekt();
Auf private_eigenschaft
und private_methode
kann von außen nicht zugegriffen werden. Daher wird zweimal „undefined“ ausgegeben:
window.alert(objekt.private_eigenschaft + " " + objekt.private_methode);
Der Zugriff auf oeffentliche_eigenschaft
hingegen ist von außen möglich. Es wird „öffentlich“ ausgegeben:
window.alert(objekt.oeffentliche_eigenschaft);
Ebenso können privilegierte_methode
und oeffentliche_methode
von außen aufgerufen werden:
objekt.privilegierte_methode();
objekt.oeffentliche_methode();
Diese Methoden demonstrieren die unterschiedlichen Zugriffsrechte.
privilegierte_methode
gibt die Eigenschaften private_eigenschaft
und oeffentliche_eigenschaft
aus. Im Meldungsfenster wird „privat öffentlich“ ausgegeben. Danach ruft sie private_methode()
auf, die noch einmal dasselbe demonstriert.
oeffentliche_methode
hingegen hat keinen Zugriff auf private_eigenschaft
und private_methode
. Das Meldungsfenster zeigt zweimal „undefined“. Lediglich der Zugriff auf oeffentliche_eigenschaft
gelingt.
Das Ansprechen von öffentlichen Eigenschaften und Methoden gestaltet sich in privaten Methoden schwierig, weil this
nicht wie in öffentlichen Methoden auf das aktuelle Objekt verweist. Daher bedient man sich eines Tricks, indem man im Konstruktor this
in einer privaten Eigenschaft speichert, gängigerweise self
. Darüber gelingt der Zugriff auf öffentliche Eigenschaften und Methoden in privaten Methoden.
Vererbung (Die Eigenschaft ,prototype‘)
Jede Funktion, d. h. jedes vom Function
-Prototyp abgeleitete Objekt verfügt über eine Eigenschaft prototype
. Diese übernimmt eine wichtige Aufgabe, wenn die Funktion als Konstruktor benutzt wird, um neue Objekte zu initialisieren. Die Eigenschaft prototype
definiert in diesem Falle gemeinsame Eigenschaften aller Objekte, die mit dem Konstruktor erstellt werden. Man spricht von prototyp-basierter Vererbung. Auf diese Weise ermöglicht JavaScript mehrstufige Vererbung:
Konstruktor eines Prototyps erstellen:
function Kraftfahrzeug (Fabrikat) {
this.Fabrikat = Fabrikat;
this.Beispieleigenschaft = "Beispielwert";
}
Konstruktor des abgeleiteten Prototyps erstellen:
function PKW (Fabrikat) {
this.constructor(Fabrikat);
this.weitereEigenschaft = "Beispielwert";
}
PKW.prototype = new Kraftfahrzeug();
Eine neue Instanz des allgemeinen Prototyps Kraftfahrzeug
dient als Muster des abgeleiteten Prototyps PKW
. Dadurch werden die Eigenschaften des allgemeinen Prototyps an den abgeleiteten Prototyp vererbt: Jedes PKW-Objekt ist gleichzeitig ein Kraftfahrzeug-Objekt. (Achtung: durch PKW.prototype = new Kraftfahrzeug()
wird die Funktion Kraftfahrzeug ausgeführt.) Über this.constructor
kann im PKW-Konstruktor der Kraftfahrzeug-Konstruktor angesprochen werden. Dieses wird im Beispiel dazu genutzt, die Parameter an letztgenannten weiterzugeben. So muss this.Fabrikat = Fabrikat;
nur im Kraftfahrzeug-Konstruktor notiert sein.
Instanz des Prototyps PKW
erstellen:
var Golf = new PKW("Volkswagen Golf");
var Ente = new PKW("Citroen 2CV");
Über die Eigenschaft prototype
der Konstruktorfunktion können einem Prototyp auch nachträglich Eigenschaften und Methoden hinzugefügt werden. Diese Änderungen wirken sich auf alle davon abgeleiteten Objekte aus:
PKW.prototype.Radanzahl = 4;
PKW.prototype.zeigeRadanzahl = function () {
window.alert(this.Fabrikat + " hat " + this.Radanzahl + " Räder.");
};
Golf.zeigeRadanzahl(); // Ausgabe: „Volkswagen Golf hat 4 Räder.“
Ente.zeigeRadanzahl(); // Ausgabe: „Citroen 2CV hat 4 Räder.“
Eine nützliche Methode des Object
-Prototyps ist hasOwnProperty(Eigenschaftsname)
. Sie gibt einen booleschen Wert, also true
oder false
zurück. Dadurch lässt sich ermitteln, ob eine bestimmte Eigenschaft durch dessen Konstruktor selbst oder durch seine Prototyp-Kette definiert wird. Im Beispiel ergibt Golf.hasOwnProperty("Radanzahl")
false
, ebenso wie Golf.hasOwnProperty("zeigeRadanzahl")
. Beide Eigenschaften wurden nachträglich über PKW.prototype
hinzugefügt. Golf.hasOwnProperty("Fabrikat")
und Golf.hasOwnProperty("weitereEigenschaft")
hingegen ergeben true
, weil diese Eigenschaften durch die Konstruktoren Kraftfahrzeug
und PKW
belegt wurden.
Dialogmethoden / Benutzereingaben
Meistens erfolgt die Interaktion mit dem Benutzer über Änderungen an Inhalten des HTML-Dokuments, insbesondere über Formulare im Dokument, dabei greift JavaScript über das DOM (Document Object Model) auf die Elemente des HTML-Dokuments zu. Außerdem stehen drei Methoden des Window-Objektes bereit: alert()
, confirm()
und prompt()
; mit jeder einzelnen dieser Methoden kann man den Benutzer auffällig ansprechen bzw. zu einer Eingabe auffordern. Dafür zeigt eine solche Methode ein modales Fenster an; modal bedeutet, der Benutzer muss dieses Fenster zunächst schließen, bevor er zum aufrufenden Dokument zurückkehren kann.
Alarmfenster:
Zeigt einen Text in einem eigenen Meldungsfenster an. Beispiel:
window.alert("Hello World");
Bestätigungsfrage:
Zeigt einen Dialog mit den Schaltflächen „OK“ und „Abbrechen“ an. Zurückgegeben wird einer der booleschen Werte true
oder false
, je nachdem welche Schaltfläche der Benutzer auswählt.
var bestaetigt = window.confirm("Bitte bestätigen");
Eingabeaufforderung:
Es wird ein Dialog zur Texteingabe angezeigt. Beispiel:
var eingabe = window.prompt("Bitte geben Sie einen Text ein:", "");
In einem fertigen Script sind diese Methoden eher selten anzutreffen, während der Script-Entwicklung hingegen werden sie gerne benutzt, um Fehler auszumachen, um mit geringem Aufwand einen Variablenwert zu prüfen oder um festzustellen, ob eine bestimmte Stelle im Script überhaupt erreicht wird.
Fehlerbehandlung
Die neueren Versionen von ECMAScript, wie sie im Internet Explorer 5 und Netscape Navigator 6 eingebaut sind, verfügen über eine von Java übernommene Anweisung try … catch
zur Fehlerbehandlung.
Die Anweisung try … catch … finally
fängt Ausnahmen (exceptions), die aufgrund eines Fehlers oder einer throw
-Anweisung auftreten, ab. Die Syntax ist wie folgt:
try {
// Anweisungen, in denen Ausnahmen auftreten oder ausgelöst werden können
} catch (exception) {
// Anweisungsfolge, die im Ausnahmefall ausgeführt wird.
// In diesem Teil kann die Fehlerbehandlung erfolgen.
} finally {
// Anweisungsfolge, die anschließend in jedem Fall ausgeführt wird.
}
…
throw("sample exception");
Zu Beginn werden die Anweisungen im try
-Block ausgeführt. Falls eine Ausnahme auftritt, wird der Kontrollfluss sofort zum catch
-Block mit dem Ausnahmeobjekt als Parameter umgeleitet.
Im Normalfall wird der Ausnahmeblock übersprungen. Nach der Ausführung des try
-Blocks (auch teilweise) und gegebenenfalls des catch
-Blocks werden in jedem Fall die Anweisungen im finally
-Block ausgeführt. Der finally
-Teil kann weggelassen werden, alternativ der catch
-Teil.
JavaScript-Bibliotheken
Für die Erstellung von browserübergreifenden Webanwendungen mit Hilfe von JavaScript stehen JavaScript-Bibliotheken, sogenannte Toolkits bereit. Es handelt sich dabei um eine Sammlung von JavaScript-Funktionen, die den JavaScript-Programmierer in seiner Arbeit unterstützen sollen. Toolkits, die nicht nur häufig benutzte Standardfunktionen zur Verfügung stellen, sondern durch ein besonderes Maß an Abstraktion eine grundlegend andere Programmierung nach sich ziehen, werden auch Frameworks genannt.
Ausgelöst von neuen Konzepten wie Ajax entstand seit 2004 ein neues Interesse für JavaScript. JavaScript wird zunehmend für Rich-Client-Anwendungen benutzt, die das Aussehen und die Bedienung von herkömmlichen Desktop-Programmen auf Web-gestützte Anwendungen übertragen. JavaScript spielt dabei eine Schlüsselrolle. Im Zuge dieser neuen Anforderungen entstanden verschiedene Bibliotheken, die die Entwicklung solcher Anwendungen vereinfachen wollen. Neben Ajax-Funktionalitäten bieten die meisten dieser Bibliotheken eine eigene Basis für objektorientierte Programmierung, eine Abstraktionsschicht für das komfortable Arbeiten mit dem DOM sowie grafische Effekte wie Animationen. Aber auch schon vor dem breiten Einsatz von Ajax existierten Funktionssammlungen zur Unterstützung der browserübergreifenden Programmierung.
Zu den bekannten JavaScript-Bibliotheken und Frameworks zählen Dojo Toolkit, Ext JS, jQuery, MooTools, Prototype, Qooxdoo und die Yahoo! UI Library. Speziell mit grafischen Effekten beschäftigen sich Moo.fx und Script.aculo.us.
Einige JavaScript-Projekte implementieren eigene
oder bereits existente andere
Sprachen, um die Ausdrucksmöglichkeiten von Javascript zu erweitern, in anderen Sprachen geschriebene Skripte im Browser ausführen zu können, oder einfach zur Unterhaltung oder als Demonstration. Auch für JavaScript selbst existiert ein in JS geschriebener Interpreter, Narcissus.
Mit CommonJS existiert ein Projekt, dass sich dem Ziel widmet eine Standardbibliothek für Anwendungsentwicklung mit Javascript zu spezifizieren.[8] Es gibt bereits eine erste Version der Spezifikation und mehrere Implementierungen[9].
Literatur
- Mark Lubkowitz: Webseiten programmieren und gestalten – HTML, CSS, JavaScript, PHP, Perl, MySQL, SVG. 2. Auflage, Galileo Press, Bonn 2005, ISBN 3-89842-557-6
- Ralph Steyer: JavaScript. Einstieg für Anspruchsvolle. Addison-Wesley, München 2006, ISBN 3-8273-2466-1
- David Flanagan: JavaScript – das umfassende Referenzwerk. 3. Auflage. O’Reilly, Köln 2007, ISBN 3-89721-491-1
- Michael Seeboerger-Weichselbaum: Das Einsteigerseminar JavaScript. 4. Auflage. bhv, Bonn 2007, ISBN 3-8266-7472-3
- Ralph Steyer: Das JavaScript Codebook. Addison-Wesley, München 2008, ISBN 3-8273-2717-2
- Douglas Crockford: Das Beste an JavaScript. O’Reilly, Köln 2008, ISBN 3-8972-1876-3
- Christian Wenz: JavaScript und AJAX. Das umfassende Handbuch. 9. Auflage. Galileo Press, Bonn 2009, ISBN 3-89842-859-1
- Stefan Koch: JavaScript – Einführung, Programmierung, Referenz. 5. Auflage. dpunkt.verlag, Heidelberg 2009, ISBN 3-89864-395-6
Siehe auch
- Bookmarklet (kleine JavaScript-Programme im Browser)
- ActionScript (Bezeichnung für eine JavaScript-ähnliche Skriptsprache in Flash und Macromedia Director, wo es alternativ zu Lingo verwendet werden kann.)
- Aktive Inhalte
Weblinks
- Wikibooks: Websiteentwicklung: JavaScript – Lern- und Lehrmaterialien
- Linkkatalog zum Thema JavaScript bei curlie.org (ehemals DMOZ)
Spezifikationen
- ISO-genormte ECMAScript-Spezifikation (ISO/IEC 16262:2002) (Englisch/Französisch)
- ECMAScript-Spezifikation (Englisch, PDF) (HTML-Version)
- Netscape JavaScript 1.3: Spezifikation von Mozilla (Englisch)
- JavaScript 1.5: Spezifikation/Referenz von Mozilla (Englisch)
Dokumentationen
- JavaScript-Kapitel bei SELFHTML
- JavaScript und AJAX (Online-Fassung von Christian Wenz: JavaScript und AJAX. Das umfassende Handbuch. Galileo Press, Bonn 2006, ISBN 3-89842-859-1)
- Eloquent JavaScript (Freiverfügbares E-Book)
Quellen
- ↑ Brendan Eich: JavaScript at Ten Years, 2005.
- ↑ Sun Trademarks
- ↑ Pressemitteilung von Sun zum Erscheinen der JRE 6.0, 11. Dezember 2006.
- ↑ John Resig: Versions of JavaScript. Ejohn.org, abgerufen am 19. Mai 2009.
- ↑ MDC: ECMAScript DontEnum attribute
- ↑ MDC: for each...in
- ↑ siehe auch: named function expressions demystified
- ↑ http://www.commonjs.org
- ↑ http://wiki.commonjs.org/wiki/CommonJS#Implementations