Webtechnologien Teil 15: JavaScript

Transcription

Webtechnologien Teil 15: JavaScript
Webtechnologien
Teil 15: JavaScript - Teil I
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
04.12.15 1
Literatur
[15-1] Flanagan, David: JavaScript. Kurz & Gut. O'Reilly, 4. Auflage, 2012
[15-2] Lubkowitz, Mark: Webseiten programmieren und gestalten. Galileo
Computing, 2003
[15-3] Münz, Stefan: <Professionelle Websites>. Addison-Wesley, 2005
[15-4] Steyer, Ralph: JavaScript. Addison-Wesley, 2007
[15-5] Steyer, Ralph: Das JavaScript Codebook. 2. Auflage, Addison-Wesley, 2005
[15-6] Flanagan, David: JavaScript – Das umfassende Referenzwerk. O'Reilly, 6.
Auflage, 2012 (1.200 Seiten)
[15-7] Nix, Markus: Musterhaft - Design Patterns mit JavaScript. Linux Enterprise,
1/2.2004, S.62-65
[15-8] Stefanov, Stoyan: JavaScript Patterns. O'Reilly, 2011
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
2
Web – Literatur und Werkzeuge
[W1]
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
[W2]
http://de.wikipedia.org/wiki/JavaScript
[W3]
Zum Prüfen auf syntaktische Korrektheit: JSLint
http://www.jslint.com
[W4]
Zum schnellen Testen: JavaScript Shell
http://www.squarefree.com/shell
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
3
Geschichte
• Ursprünglich von Netscape ab 1995 entwickelt
• Standardisiert durch die ECMA:
ECMAScript in den Versionen 1 bis 3 und 5
Die Version 6 ist in Arbeit.
• Aktuelle Version: 1.8.5 (2010)
• Wie bei CSS gibt es bei den Browsern Inkompatibilitäten,
besonders bei ECMAScript5 und HTML5
• JS = JavaScript
• JavaScript hat nichts mit Java zu tun...
• Mit JS wird auf dem Browser aktiver Code ausgeführt.
• Es gibt auch Server, die dies auch auf der Serverseite ausführen –
dies wird hier nicht behandelt.
• Auch Versionen von PDF haben JavaScript integriert.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
4
Versionen – ECMA 262
ECMAv1 entspricht JavaScript 1.3 und JScript 3.0
ECMAv2 ist eine redaktionelle Überarbeitung von ECMAv1
ECMAv3 entspricht JavaScript 1.5
ECMAv4 ist nie frei gegeben worden
ECMAv5.1 ist aktuell
http://www.ecma-international.org/publications/files/ECMAST/Ecma-262.pdf
• ECMAv6 ist in Arbeit
•
•
•
•
•
In diesem Teil wird JavaScript in der Version 1.5 behandelt.
Die aktuelle Version ist 1.8.5 von 2010.
Siehe http://de.wikipedia.org/wiki/JavaScript
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
5
Aufrufen und Einbinden I
<script language="JavaScript">
... JavaScript...
</script>
<script language="JavaScript" src=URL type="application/x-javascript">
</script>
<script language="JavaScript" src=URL type="text/javascript">
</script>
•
•
•
•
JavaScript kann innerhalb des Kopfes oder an beliebiger Stelle im Body stehen.
Die Statements werden innerhalb der Datei von vorn nach hinten ausgeführt.
Deklarationen sollten möglichst vorne im Kopf stehen. Die Deklarationen
benutzende Befehle sollten möglichst hinten in der HTML-Datei stehen.
Wenn die externe Dateiform benutzt wird, dürfen in der *.js-Datei keine HTMLKommentare stehen.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
6
Aufrufen und Einbinden II – Alte Browser
<script language="JavaScript1.2">
... JavaScript...
</script>
•
•
•
Müssen versionsabhängige Konstrukte benutzt werden, sollte die
niedrigste, erforderliche Versionsnummer angegeben werden. Die
Angabe der Version im SCRIPT-Tag führt dazu, dass der umschlossene
Teil ab einschließlich der angegebenen Version ausgeführt wird.
Zwischen "JavaScript" und der Versionsangabe dürfen keine Leerzeichen
stehen.
Default ist die Version 1.0, wobei "JavaScript1.0" nicht angegeben
werden sollte, da der Explorer damit nicht klar kommt.
<noscript>
....Normaler HTML-Code...
</noscript>
•
Für Browser mit ausgeschaltetem JS kann JS-freier Code durch das
noscript-Element geklammert werden.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
7
Aufruf über eine URL
javascript: Name-Der-JS-Routine [Parameter]
•
•
•
Wenn als Protokoll in der Adresszeile "javascript" benutzt wird, rufen
JavaScript-fähige Browser das in der URL angegebene Script auf - anstatt
eine Seite zu laden.
Überall, wo in der Datei eine URL stehen kann, kann über diesen
Mechanismus ein JavaScript-Statement ausgeführt werden.
Dies wird "Inline-Referenz" genannt.
Derselbe Mechanismus kann auch in Formularen beim action-Attribut
benutzt werden.
Beispiel:
<a href="javascript:alert('blabla');">... Text ... </a>
Dies wird selten verwendet und sollte vermieden werden.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
8
Syntax
• Bezeichner sind Groß-/Kleinschreibung-sensitiv.
Bezeichner müssen mit einem Buchstaben beginnen, gefolgt von
Buchstaben, Ziffer oder Unterstrich.
• Bezeichner sollten kürzer als 32 Zeichen sein.
• Reservierte Bezeichner können nicht umdefiniert werden und werden
immer klein geschrieben.
• Leerzeichen haben keine Bedeutung; wo ein Leerzeichen stehen
kann, kann auch ein Zeilenende stehen.
Aber: Ist der Rest auf einer Zeile ein gültiges, aber unvollständiges
Statement, dann interpretieren die Browser dies fälschlicherweise als
vollständig,
d.h. jedes Statement vollständig in eine Zeile schreiben.
• Kommentare
– // bis zum Ende der Zeile wie in C++ und Java
– /* ... */ über Zeilenenden hinweg
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
9
Variablen, Typen und Zuweisungen
var variable [= Expression] [, variable [= Expression] ...];
variable= Expression;
•
•
•
•
•
Variablen sollten deklariert werden; dies erfolgt ohne Typangabe.
Variablen müssen deklariert werden, wenn sie lokal zu einer Funktion sein
sollen.
Es wird empfohlen immer alle Variablen zu deklarieren.
Der Typ einer Variablen ist der Typ der Daten auf der rechten Seite der
zuletzt ausgeführten Zuweisung (wie in PHP).
Variablen können gleich bei der Deklaration einen Wert und damit einen
Typ erhalten.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
10
Ganze Zahlen (integer und real)
var
var
var
var
•
•
•
dez=
16;
okt=
016;
hex=
0x16;
float= 1.6e4;
// Oktal!
Die Typen von Zahlen werden wie in C/C++/Java behandelt:
– "Normale" Darstellung: Dezimal
– Vorlaufende 0: Oktal
– Vorlaufendes 0x: Hexadezimal
– Punkt und/oder Exponent ("e"): floating point
Floating Point-Variablen sind 64 bit lang
(entspricht double in Java)
In JavaScript werden integer, float und double zum Typ number
zusammen gefasst, siehe dazu
http://www.html-seminar.de/javascript-datentypen.htm.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
11
Zeichenketten (Strings) I
var num= 1;
var zeich= "1";
var char= '1';
(1) char= zeich+zeich;
(2) num= num+num;
(3) zeich= ""+num;
•
•
•
/* ergibt "11" */
/* ergibt 2
*/
/* ergibt "2" */
Zeichenketten werden in einfache oder doppelte Anführungszeichen jedoch nicht gemischt - eingeschlossen.
Die Operation "+" zwischen Strings setzt die Strings zusammen,
während bei Zahlen addiert wird (also wie in Java).
Der Typ des Ausdrucks wird durch die Konvertierung bestimmt, siehe
Zeile (3). Hier wird der numerische Wert in eine Zeichenkette
konvertiert und mit dem leeren String verbunden.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
12
Zeichenketten (Strings) II - Typ
Beispiel
Ergebnis
Typ
" Bäume haben " + 8
" Bäume haben 8"
String
" Bäume haben " + 7*7
" Bäume haben 49"
String
7 + 6 +" Bäume haben "
"13 Bäume haben "
String
" Bäume haben " + 4 + 8
" Bäume haben 48"
String
"7" * 8
56
Integer
"7" + 8
"78"
String
Tipp: Lassen Sie alle Tricks!
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
13
Zeichenketten (Strings) III
Das Escape-Zeichen in Strings ist der Backslash "\":
\n
New Line
\r
Carriage Return (dieselbe Zeile)
\t
Horizontaler Tabulator vorwärts
\f
Form Feed: Seitenvorschub
\b
Backspace: eine Zeichenposition zurück
\"
" selbst
\'
' selbst
\\
\ selbst
\ooo
Zeichen aus ISO 8859-1 mit drei Oktalziffern o
\xhh
Zeichen aus ISO 8859-1 mit zwei Hexadezimalziffern h
\uhhhh
Zeichen aus ISO 8859-1 mit vier Hexadezimalziffern h
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
14
typeof-Operator
Beispiel
Ergebnis von typeof
var ID= 7;
typeof ID;
"number"
var ID= "Hallo!";
typeof ID;
"string"
var ID= false;
typeof ID;
"boolean"
Um den aktuellen Typ eines Objekts herauszubekommen, wird der
typeof-Operator benutzt, er bestimmt aber nicht den Typ. Dies erfolgt
durch eine Zuweisung.
Darüber hinaus gibt es noch folgende Typen:
(1) "function"
(2) "object"
(3) "undefined" als besonderer "Typ"
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
15
Konstanten und Vergleichsoperatoren
Konstanten
true (wahr)
false (falsch)
Operator
Bedeutung
Bemerkungen
==
Gleichheit
Wertgleichheit NACH Konvertierung
!=
Ungleichheit
Ungleichheit NACH Konvertierung
<
Kleiner als
>
Größer als
<=
Kleiner-gleich als
>=
Größer-gleich als
===
Identität
Wertgleichheit OHNE Konvertierung
!==
Nicht-Identität
Ungleichheit OHNE Konvertierung
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
16
Arithmetische Operatoren I
Operator
Erläuterung
Beispiel
2+2
Ergebnis
+
Addition
-
Subtraktion
2-1
1
*
Multiplikation
2*3
6
/
Division
16/4
4
%
Modulo
7%3
1
++
Inkrement
a= 10;
a++
11
--
Dekrement
a= 10;
--a
9
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
4
17
Arithmetische Operatoren II
Statement
Ergebnis
Wert von a
Wert von b
a++ + b
6.5
6
1.5
++a + b
8.5
7
1.5
a-- + b
8.5
6
1.5
--a + b
6.5
5
1.5
a= 5;
b= 1.5;
Die Post-Operation wird am Ende des Statements ausgeführt,
die Pre-Operation vor dem Auswerten des (Teil-)Ausdrucks.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
18
Logische Operatoren
Operator
Erläuterung
Beispiel
Ergebnis
&&
Und/And
true && false
false
||
Oder/Or
true && false
true
!
Nicht/Negation
!true
false
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
19
Zuweisungen
Operator
Erläuterung
Beispiel
Ergebnis
Zuweisung
A = 5
5
+=
Addition mit Zuweisung
A +=5
10
+=
Anfügung mit Zuweisung
B= "Schön"
B += "heit"
"Schönheit"
-=
Subtraktion mit Zuweisung
A -= 2
8
*=
Multiplikation mit Zuweisung
A *= 2
16
/=
Division mit Zuweisung
A /=4
4
%=
Modulo mit Zuweisung
A %= 3
1
=
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
20
IF-Konstrukt I
if (Bedingung) {
...
} else {
...
}
•
•
•
•
if (Bedingung) {
...
}
Das IF-Konstrukt entspricht dem von C/C++/Java.
Die geschweiften Klammern können bei nur einem Statement im Block
weggelassen werden (wovon dringend abgeraten wird).
Hinter jeder Anweisung innerhalb der Blöcke muss ein ";" stehen,
nicht jedoch nach einem IF-Konstrukt.
Es gibt keine Zusammenfassungen geschachtelter Konstrukte wie elif
o.ä.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
21
IF-Konstrukt II
(condition) ? TruePart : FalsePart
Beispiel:
Zeit= '7 ' + (Zeit>=12) ? 'PM': 'AM';
•
Eine derartige IF-Konstruktion kann auch als Teil von Ausdrücken
benutzt werden (wovon abgeraten wird).
Dies gilt genauso für C, C++, Java und PHP.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
22
Switch-Konstrukt I
switch(Expression) {
case Const: ...;
break;
case Const: ...;
break;
default: ...;
}
•
•
•
•
switch(Tag) {
case "Montag": ...;
break;
case "Dienstag": ...;
break;
default: ...;
}
Dies entspricht dem von C/C++/Java, wobei die Art der Konstanten hinter
dem case offener ist: es sind hier auch Strings erlaubt.
Const kann auch ein Ausdruck mit Konstanten sein.
Die Datentypen der Ausdrücke hinter dem case und dem anschließenden
Doppelpunkt können bei den einzelnen Fällen unterschiedlich sein.
Das Switch wird in sequentieller Reihenfolge mit dem Ausdruck hinter dem
switch, also der Expression mit der Identität === solange verglichen bis
ein wahr heraus kommt.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
23
While-Schleife I
while (Bedingung) {
...
}
•
•
do {
...
} while (Bedingung);
Die Bedingung der while-Schleife wird initial geprüft und die Schleife
solange durchlaufen bis die Bedingung falsch ist.
Die do-Schleife wird mindestens einmal durchlaufen; solange diese Prüfung
den Wert True liefert, wird die Schleife erneut durchlaufen.
•
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
24
While-Schleife II
<script language="JavaScript">
var i= 0;
while (i<7) {
document.write("hi");
i++;
}
</script>
•
•
Dieses JavaScript-Stück gibt "hihihihihihihi" aus.
document.write() hat dieselbe Bedeutung wie write() in C bzw.
system.out.print in Java.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
25
For-Schleife I
for (Init; Condition; Increment) {
...
}
for (Variable in Objekt) {
...
}
Das For-Konstrukt
entspricht
dem aus C/C++/Java.
Die Schleife wird für jede
Eigenschaft des Objektes
durchlaufen.
Für "for (Variable in Objekt) {...}" gibt es folgende Hinweise:
•
•
•
Die Reihenfolge der Schleifendurchläufe ist undefiniert.
Der Laufvariablen wird der Name des Attributes als String
zugewiesen, nicht als Objekt.
Der Zugriff auf das Attribut selbst kann über das Objekt als
assoziatives Array erfolgen: Objekt[Laufvariable].
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
26
For-Schleife II
<script language="JavaScript">
var i;
for (i= 0; i<7; i++) {
document.writeln("hi <br>");
}
</script>
•
•
•
•
Dieses JavaScript-Stück gibt 7 Zeilen mit einem "hi" aus.
document.writeln() hat dieselbe Bedeutung wie printf() in C
gefolgt von einem Newline ('\n'), was in HTML keine Bedeutung hat.
Wenn mit document.write(ln) Tags ausgegeben werden, so werden
sie danach als HTML-Konstrukte durch den Browser interpretiert.
Dabei werden keine weiteren <script>-Tags mit JS-Code ausgeführt.
Bei allen for-Schleifen lässt sich die Laufvariable per var deklarieren:
for (var Variable; Condition; Increment) { ...
for (var Variable in Objekt) { ...
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
27
Break und Continue
• In jeder for-/while-/do-Schleife können break und continue
benutzt werden:
– break:
Die Schleife wird abgebrochen, alle Variablen behalten ihren
augenblicklichen Wert.
– continue:
Es wird unmittelbar zum internen Schleifenende gesprungen und
die Abbruchbedingung geprüft.
• Beide Konstrukte haben dieselbe Bedeutung wie in C/C++ und
Java.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
28
Eine Ausnahme werfen...
throw Ausdruck;
try {
...Anweisungen...
}
Eine Ausnahme signalisieren.
Block mit Anweisungen, deren
Ausnahmen behandelt werden
catch(Variable) {
...Anweisungen...
}
Die Nummer der Ausnahme wird der
Variablen zugewiesen und die
Anweisungen ausgeführt.
finally {
...Anweisungen...
}
Block mit Anweisungen, die immer
nach try/catch ausgeführt werden
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
29
Prozeduren und Funktionen
function Name([Parameterliste]) {
/* Deklaration */
...
}
...
Name([Parameterliste]);
/* Aufruf */
...
function Name([Parameterliste]) {
...
return Expression;
}
....
Variable= Name([Parameterliste]);
•
•
•
/* Deklaration */
/* Aufruf */
Zwischen Prozeduren und Funktionen besteht nur der Unterschied, dass
letztere ein return haben.
Parameterlisten können deklariert werden.
Parameterlisten können von Aufruf zu Aufruf unterschiedlich lang sein.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
30
Funktionen I - Beispiele
function Mod(Wert,Divi) {
Resultat= Wert%Divi;
return Resultat;
}
value= Mod(23,7);
/* Deklaration */
/* nicht deklariert */
/* Aufruf */
function Modulo(Wert,Divi) {
if (Divi==0) {
return undefined; /* Schlüsselwort */
} else {
Resultat= Wert%Divi;
return Resultat;
}
}
value= Modulo(23,7);
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
31
undefined und null
• undefined ist der Wert einer angelegten Variablen, der noch nie
etwas zugewiesen wurde (entspricht dem NULL in PHP).
• Die Abfrage auf undefined sieht z.B. so aus:
x= fun(....);
if (x==undefined) {
... x hat undefined als Wert …
}
• Werden nicht-existente Objekteigenschaften abgefragt, wird
undefined geliefert.
• null ist der Wert eines Objekts, das keinerlei Werte irgendeines
Typs enthält.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
32
Funktionsreferenz I
function plus(a,b) {
return a+b;
}
function minus(a,b) {
return a-b;
}
var sum= plus(2,3);
var op= plus;
// Referenz auf plus()
sum= op(2,3);
// Aufruf von plus(2,3)
op= minus;
sum= op(2,3);
// welchen Wert hat sum?
•
Wird der Name einer Routine ohne "()" benutzt, so ist damit eine
Referenz auf die Funktion gemeint, also dessen Adresse.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
33
Funktionsreferenz II - Das Beispiel dazu
function plus(a,b) {
return a+b;
}
function minus(a,b) {
return a-b;
}
...
var sum= plus(2,3);
document.write("plus(2,3)="+sum+"<br>");
var op= plus;
sum= op(2,3);
document.write("plus(2,3)="+sum+"<br>");
op= minus;
sum= op(2,3);
document.write("plus(2,3)="+sum+"<br>");
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
plus(2,3)=5
plus(2,3)=5
plus(2,3)=-1
34
Zugriff auf Argumente
function q1(val) {
return val*val;
}
•
•
•
•
function q2() {
return arguments[0]*arguments[0];
}
Alle beim Aufruf übergebenen Argumente werden in einem Array
Namens arguments[] mit der Länge arguments.length abgelegt.
Der Index des ersten Parameters ist 0.
Die beiden Beispiele sind gleichwertig.
Mit diesem Array können dynamisch viele Parameter verarbeitet
werden.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
35
Deklarationen I
•
•
•
Es gibt globale und lokale Variablen.
Lokale Variablen werden innerhalb Funktionen deklariert und verdecken
globale gleichen Namens.
Deklarierte Parameter werden wie lokale Variablen behandelt.
var p= 10;
var q= 10;
var r= 10;
function fun(r,s,t) {
var p= 9;
r= 2;
}
fun(q,20,30);
var s= p+q+r;
/* 9+10+10 oder 10+10+10 ? */
Mit der lokalen Deklaration von p würde s den Wert 29 erhalten, sonst 30.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
36
Deklarationen II
<html><head>
<title>JS-Test2</title>
</head><body>
<script language="JavaScript">
var p= 10;
var q= 10;
var r= 10;
function ff(r,s,t) {
var p= 9;
r= 2;
}
document.write(p+" "+q+" "+r+"<br>");
ff(q, 20, 30);
document.write(p+" "+q+" "+r+"<br>");
var s= p+q+r;
document.write(s);
</script></body></html>
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
37
Deklarationen III
Die Parameter werden call by value übergeben;
daher hat die Zuweisung an Variable r innerhalb von fun()
keinen Effekt auf irgendetwas im aufrufenden Teil.
Es gibt also zwei Gründe zum Deklarieren (Ein Muss!):
• Deklaration als Parameter ohne Typangabe
• Deklaration einer lokalen Variablen ohne Typangabe
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
38
Vordefinierte Funktionen (Auszug) I
Funktion
Erläuterung
eval(String)
Interpretiert den String als JavaScript und liefert das
Ergebnis
parseFloat(String)
Wandelt String in Float um
Liefert NaN, wenn String mit einem nicht-numerischen Wert
beginnt (NaN = Not a Number)
Ist ein derartiges Zeichen innerhalb der Zahl, dann wird der
bis zu diesem Zeichen bestimmte Wert zurückgeliefert.
parseInt(String)
Wandelt String in Integer um,
Es gelten dieselben Bemerkungen wie bei parseFloat()
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
39
Vordefinierte Funktionen II
var x= "6";
var y= "6.777";
var z= x+y;
document.writeln(z);
z= parseInt(x)+parseFloat(y);
document.writeln(z);
Es wird "66.777" gefolgt von "12.777" ausgegeben.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
40
Objektorientierung
• In JavaScript wird nur von Objekten gesprochen. Es gibt keine
Klassen (jedenfalls im Sinne von Java).
• In JavaScript gibt es also nur Objekte.
• Eigenschaften und Methoden werden nicht wie z.B. in Java/C++
vor der Erzeugung deklariert, sondern dynamisch den Objekten
Stück für Stück zugewiesen.
• Die Objekte werden daher Stück um Stück aufgebaut.
Eine Definition einer Klasse gibt es nicht. Erst ab Version 6.
• Dadurch können Objekte, die ursprünglich vom "gleichen Typ"
waren, unterschiedliche Eigenschaften haben.
• Dies gilt auch für Methoden eines Objekts.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
41
Objekt-Konstruktor I
function KlassenName([Param1, Param2,..]) { // Konstruktor
this.Attribut1= Param1;
// neues Attribut
this.Attribut2= Param2;
// neues Attribut
...
}
var obj= new KlassenName([Param1, Param2,..]);
...
•
•
•
•
Ein Objekt wird mit einer Konstruktor-Funktion und dem Operator new
definiert, die denselben Namen wie die gedachte Klasse hat.
Also Objekte, die mit derselben Funktion per new erzeugt wurden, bilden
dadurch die Exemplare einer gemeinsamen fiktiven Klasse.
Das Schlüsselwort this verweist auf das eigene Objekt.
Die Attribute werden durch die Zuweisungen über this Stück für Stück
definiert.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
42
Objekt-Konstruktor II
function Person(vor,nach) {
this.vorname= vor;
this.nachname= nach;
}
/* Konstruktor */
...
var king= new Person("Gustav","Adolf");
/* Generierung */
var vn= king.vorname;
var nn= king.nachname;
king.nachname= nn+" der Zweite";/* König von Schweden 1594–1632 */
...
•
•
Mit der Punkt-Schreibweise wird auf die Komponenten, hier die
Attribute, des Objekts zugegriffen.
Alle so erzeugten Attribute sind lokal zum Objekt.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
43
Hinweise
• Neue Attribute können dynamisch, also auch NACH der
Erzeugung des Objekts hinzugefügt werden, so dass sich
Objekte, die von der selben Konstruktorfunktion "abstammen",
strukturell unterscheiden.
• Es sollten Namenskonventionen eingehalten werden, z. B. dass
Objektnamen mit kleinen Buchstaben beginnen und
Konstruktorfunktionen mit großen.
• Eine Vererbung, so wie in Java, gibt es nicht. Mit Hilfe des
Prototype-Konstrukts lässt sich so etwas wie Vererbung
nachbauen.
Siehe dazu:
http://www.w3schools.com/js/js_object_prototypes.asp
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
44
Beseitigung von Objekten und Attributen
var str= new String("Das ist aber ein langer String.");
...
delete str; /* str hat nun den Wert undefined */
•
•
Mit delete lassen sich Objekte, die mit new erzeugt wurden,
beseitigen.
Dies gilt auch für Attribute von Objekten:
Mit delete lassen sich aber auch Attribute löschen, z.B.
delete obj.Nachname
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
45
Abfrage nach der Existenz von Attributen
if ("Attribut" in Objekt) { ... Objekt.Attribut ... }
if ("Vorname" in kaiser) {
kaiser.Vorname= "Ferdinand";
}
•
Da dynamische Attribute erzeugt und gelöscht werden können, ist eine
Möglichkeit erforderlich, mit der der aktuelle Zustand des Objektes
abgefragt werden kann: in.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
46
Methoden I
function kroenung() {
document.write("Ab heute ist er's!<br>");
}
function Person(vor,nach) {
this.vorname= vor;
this.nachname= nach;
this.abWann= kroenung;
/* Funktionsreferenz */
}
var king= new Person("Gustav","Adolf")
/* Generierung */
king.abWann();
document.write(kroenung);
/* ??? */
Output:
Ab heute ist er's!
function kroenung() { document.write("Ab heute ist er's!
"); }
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
47
Methoden II
• Methoden werden wie Attribute behandelt.
• Die vorletzte Zeile gibt "Ab heute ist er's!" aus.
• Die letzte Zeile gibt den Source-Code von kroenung() aus:
"function kroenung() { document.write("Ab heute ist
er's!...");}"
• In der Zeile mit " this.abWann" muss Kroenung ohne Klammern
angegeben werden, da sonst nicht der gelieferte Wert
zugewiesen wird.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
48
Arrays I
var ArrayName= new Array(Size);
...
ArrayName[0]= ...;
...= ArrayName[1]...;
•
•
•
•
Es lassen nur 1-dimensionale Felder deklarieren und erzeugen.
Mehrdimensionale müssen schrittweise aufgebaut werden.
Die Indices beginnen immer bei 0 und enden bei Size-1, also wie bei
C/C++/Java.
Die Eigenschaft length liefert die Anzahl der Elemente, d.h. der Index
läuft von 0 bis ArrayName.length-1.
Statt Size kann bei Array auch eine Liste angegeben werden, wobei das
Feld so lang wird wie die Liste Elemente hat; dann werden die ArrayElemente mit den Listenwerten in der angegebenen Reihenfolge
versehen – wie in PHP.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
49
Arrays II
var Suess= new Array(4);
Suess[0]= "Schokolade";
Suess[1]= "Bonbon";
Suess[2]= "Eis";
Suess[3]= "Lutscher";
var Suess= new Array("Schokolade","Bonbon","Eis","Lutscher");
var Suess= ["Schokolade","Bonbon","Eis","Lutscher"];
•
•
•
Alle drei Formen sind äquivalent.
Ein new von einem Array mit einem Integer-Parameter erzeugt ein leeres
Feld mit der angegebenen Anzahl von Elementen.
Ein Array mit einer Liste von Werten, auch unterschiedlichen Typs,
erzeugt ein Feld mit den angegebenen dadurch vorbelegten Elementen.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
50
Mehrdimensionale Felder
for(var i= 0;i<Limit;i++) {
Feld[i]= new Array(10);
}
Hier wird eine Matrix zusammengebaut.
Die Elemente werden dann mit Feld[x][y] angesprochen.
•
•
•
Mehrdimensionale Felder müssen Dimension für Dimension z.B. in einer
For-Schleife zusammengebaut werden, indem jeweils ein neues Array
als Wert einer Array-Zelle zugewiesen wird.
Dies kann beliebig tief erfolgen.
Die Länge der Elemente der 2. und folgenden Dimension kann wie ihr
Typ unterschiedlich sein.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
51
Implementierung der Objekte I
Objekte sind intern als assoziative Arrays implementiert.
var
obj= new Object();// Objekt ohne Eigenschaften
obj.x= 10;
// Erzeugen einer neuen Eigenschaft
obj.y= 20;
// dasselbe
obj["x"]= 15;
// Alternative Schreibweise
obj["y"]= 25;
obj.sum= obj["x"]+obj.y;
var
obj= { x:10, y:20, sum:30 };
Das letzte Beispiel zeigt eine Objekt-Kodierung im JSON-Format.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
52
Implementierung der Objekte II
•
•
Mit der Funktion Object() lassen sich leere Objekte erzeugen.
Ein impliziter Aufruf von Object() erfolgt bei der Benutzung des JSONFormats.
var obj= { x:10, y:20, sum:30 };
var obj= new Object;
obj.x= 10;
obj.y= 20;
obj.sum= 30;
Beide Beispiele sind äquivalent.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
53
Noch einmal zu den Arrays
• Arrays sind spezialisierte Formen von Objekten.
• D.h. es können auch Attribute ausgelesen und zugewiesen
werden, ohne dass es Probleme gibt.
• Der Index muss zwischen 0 und 2**32 -1 liegen.
• Der Längeneigenschaft eines Feldes length kann auch ein Wert
zugewiesen werden; dann passiert folgendes:
– Ist der Wert größer als die augenblickliche Länge, wird das Feld
vergrößert.
– Ist der Wert kleiner als die augenblickliche Länge, wird das Feld
verkleinert einschließlich eines Datenverlustes.
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
54
Nach dieser Anstrengung etwas Entspannung...
Webtechnologien - WS 2015/16 - Teil 15/JavaScript I
55

Similar documents