Inhaltsverzeichnis | 16 |
1 Die Geschichte von JavaScript | 26 |
1.1 JavaScript – die Lingua franca des WWW | 26 |
1.2 Netscape und JavaScript | 26 |
1.3 Das Vorbild Self | 27 |
1.4 Das Vorbild Scheme | 28 |
1.5 JavaScript und ECMAScript | 28 |
1.6 ECMAScript 5th Edition | 29 |
1.7 Harmony | 30 |
1.8 JavaScript und HTML5 | 30 |
1.9 New Wave JavaScript | 30 |
1.10 Die JavaScript-Revolution | 31 |
1.11 Zusammenfassung | 32 |
2 JavaScript-Laufzeitumgebungen | 34 |
2.1 JavaScript-Interpreter | 34 |
2.2 Read-Eval-Print-Loop | 35 |
2.3 Der Browser | 36 |
2.4 Headless JavaScript | 36 |
2.5 Rhino | 37 |
2.6 SpiderMonkey, TraceMonkey und JägerMonkey | 38 |
2.7 Google V8 | 39 |
2.8 SquirrelFish und Nitro, Microsoft und Opera | 40 |
2.9 Welche Umgebung für welchen Zweck? | 40 |
2.10 Entwicklungsumgebungen | 40 |
2.11 Zusammenfassung | 41 |
3 Core JavaScript | 42 |
3.1 Skriptsprachen | 42 |
3.2 Typen und Werte | 43 |
3.2.1 Schwache Typisierung | 43 |
3.2.2 Literale | 43 |
3.2.3 Typeof-Operator | 43 |
3.2.4 Typenlose Verwendung | 44 |
3.3 Imperative Programmierung | 44 |
3.3.1 Ausdrücke und Operatoren | 44 |
3.3.2 Vergleiche | 45 |
3.3.3 Variablen | 45 |
3.3.4 Blöcke und Gültigkeit von Variablen | 46 |
3.3.5 Zahlen | 47 |
3.3.6 Zeichenketten | 48 |
3.3.7 Boolesche Werte | 49 |
3.3.8 Arrays | 49 |
3.3.9 Reguläre Ausdrücke | 50 |
3.3.10 Kommentare | 51 |
3.3.11 Tokens und Whitespaces | 52 |
3.3.12 Kontrollstrukturen | 53 |
3.3.13 Schleifen | 54 |
3.3.14 Ausnahmebehandlung | 56 |
3.4 Objektliteral | 57 |
3.5 Zusammenfassung | 58 |
4 JavaScript als funktionale Programmiersprache | 60 |
4.1 Funktionsliteral | 60 |
4.2 Funktionsnamen | 61 |
4.3 Parameter und Parametervalidierung | 61 |
4.4 Konfigurationsobjekt als lesbarer Parameter | 64 |
4.5 Anonyme Funktionen | 64 |
4.6 Geltungsbereiche (Scopes) | 65 |
4.7 this | 66 |
4.8 Geschachtelte Scopes und der globale Namensraum | 67 |
4.9 Closures und Module | 69 |
4.10 Funktionale Vererbung | 70 |
4.11 Callbacks | 72 |
4.12 Kaskaden | 73 |
4.13 Rekursion | 74 |
4.14 Funktions-Caching | 74 |
4.15 Currying | 75 |
4.16 Zusammenfassung | 75 |
5 JavaScript als prototypische Programmiersprache | 76 |
5.1 Definition und Verwendung | 76 |
5.2 Duck-Typing | 78 |
5.3 Prototypen | 78 |
5.4 Konstruktoren | 80 |
5.4.1 Kontruktoren und die new-Anweisung | 80 |
5.4.2 Entwurfsmuster für die new-Anweisung | 81 |
5.4.3 Konstruktor- und Prototypreferenz | 83 |
5.5 this | 83 |
5.5.1 Globales Objekt | 84 |
5.5.2 Funktion | 84 |
5.5.3 Methode | 84 |
5.5.4 Konstruktor | 84 |
5.5.5 that | 85 |
5.6 Reflexion | 85 |
5.7 Löschen von Eigenschaften | 85 |
5.8 Zusammenfassung | 86 |
6 JavaScript als objektorientierte Programmiersprache | 88 |
6.1 Objekterzeugungsmuster | 88 |
6.1.1 Rent-a-Constructor | 88 |
6.1.2 Konstruktoren überladen | 89 |
6.1.3 Rent-a-Constructor-and-a-Prototype | 89 |
6.1.4 Referenz auf die Superklasse halten | 90 |
6.2 Existierende Bibliotheken | 91 |
6.2.1 Klassenbasierte Vererbung in Prototype | 91 |
6.2.2 Douglas Crockfords Classical Inheritance in JavaScript | 93 |
6.2.3 John Resigs Simple JavaScript Inheritance | 95 |
6.3 Prototypische Vererbung | 97 |
6.4 Vererbung durch Kopieren | 98 |
6.5 Mixins | 99 |
6.6 Einzelne Methoden wiederverwenden | 100 |
6.7 Objekte in ES5 | 101 |
6.7.1 Object.preventExtensions | 101 |
6.7.2 Object.isExtensible | 101 |
6.7.3 Object.seal | 102 |
6.7.4 Object.isSealed | 102 |
6.7.5 Object.freeze | 102 |
6.7.6 Object.isFrozen | 102 |
6.8 Objekteigenschaften in ES5 | 103 |
6.8.1 Accessor-Properties | 103 |
6.8.2 Property-Descriptor | 103 |
6.8.3 Object.defineProperty | 104 |
6.8.4 Object.defineProperties | 105 |
6.8.5 Object.getOwnPropertyDescriptor | 105 |
6.8.6 Object.keys | 105 |
6.8.7 Object.getOwnPropertyNames | 106 |
6.8.8 Enumeration | 106 |
6.9 Objekterzeugung in ES5 | 106 |
6.10 Bind in ES5 | 107 |
6.11 Zusammenfassung | 107 |
7 Eingebaute Objekte | 108 |
7.1 Boolean | 109 |
7.2 Number | 109 |
7.3 String | 110 |
7.4 Array | 112 |
7.4.1 Array-ähnliche Objekte | 113 |
7.4.2 Arrays und reguläre Ausdrücke | 113 |
7.4.3 Arrays und ECMAScript 5th Edition | 113 |
7.5 Date | 114 |
7.6 Math | 116 |
7.7 RegExp | 117 |
7.8 Zusammenfassung | 119 |
8 Entwurfsmuster | 120 |
8.1 Singleton | 120 |
8.2 Iterator | 122 |
8.3 Factory | 124 |
8.4 Strategy | 125 |
8.5 Decorator | 126 |
8.6 Bridge | 128 |
8.7 Facade | 129 |
8.8 Adapter | 130 |
8.9 Proxy | 131 |
8.10 Mediator | 132 |
8.11 Observer | 133 |
8.12 Template-Method | 135 |
8.13 Command | 136 |
8.14 Spooling | 140 |
8.15 Futures und Promises | 141 |
8.16 Fear of Code | 143 |
8.17 Zusammenfassung | 143 |
9 JavaScript im Webbrowser – Teil 1 | 144 |
9.1 Sandboxing | 144 |
9.2 Einbettung und Referenzierung | 145 |
9.3 Das Laden der Seite | 146 |
9.4 Das Window-Objekt | 147 |
9.5 Das Document-Objekt | 147 |
9.6 DOM-API | 148 |
9.7 Timer | 153 |
9.8 Events | 153 |
9.9 Zusammenfassung | 157 |
10 JavaScript auf dem Server mit Node | 158 |
10.1 Node-Grundlagen | 158 |
10.1.1 Netzwerkapplikationen | 158 |
10.1.2 Non-Blocking I/O | 159 |
10.1.3 Event-Loop | 159 |
10.1.4 Anwendungsfälle für Node | 160 |
10.2 Node installieren | 161 |
10.3 Hello World in Node | 162 |
10.4 Events | 163 |
10.5 Buffer | 166 |
10.6 Streams | 169 |
10.6.1 Readable Streams | 170 |
10.6.2 Writable Streams | 172 |
10.7 Weitere APIs | 174 |
10.8 Module | 174 |
10.9 Package-Management | 177 |
10.10 Debugging | 180 |
10.11 Beispielapplikation mit dem Express-Framework | 182 |
10.12 Zusammenfassung | 195 |
11 JavaScript im Webbrowser – Teil 2 | 196 |
11.1 Formulare | 196 |
11.2 Ajax | 199 |
11.3 Eine Einführung in jQuery | 202 |
11.4 Einführung in jQuery-UI | 207 |
11.4.1 Widgets | 207 |
11.4.2 Interaction-Helpers und Effekte | 212 |
11.4.3 Themeroller | 212 |
11.5 Zusammenfassung | 212 |
12 Build-Automatisierung | 214 |
12.1 Kompilieren | 214 |
12.2 Packaging | 215 |
12.2.1 Assemblierung | 215 |
12.2.2 Minifizierung | 216 |
12.2.3 CommonJS-Module und Pakete | 216 |
12.3 Testing | 217 |
12.4 Linting | 217 |
12.5 Deployment | 217 |
12.6 Dokumentation | 217 |
12.7 Maven | 218 |
12.7.1 wro4j | 218 |
12.7.2 Jasmine-Maven-Plug-in | 220 |
12.7.3 JsDoc-Toolkit-Maven-Plug-in | 221 |
12.8 Weitere Build-Systeme | 222 |
12.9 Require.js | 222 |
12.10 Zusammenfassung | 222 |
13 Testen | 224 |
13.1 Klassisches Testen | 224 |
13.2 User-Interface-Tests | 225 |
13.3 Testgetriebene Entwicklung | 225 |
13.4 Unit Tests | 226 |
13.5 Modultests im Browser | 228 |
13.6 Stand-alone-Unit-Tests mit Jasmine | 231 |
13.7 Verteiltes Testen mit JsTestDriver | 236 |
13.8 Zusammenfassung | 239 |
14 Nachwort | 240 |
Anhang | 242 |
A Referenz Core JavaScript | 244 |
A.1 Anweisungen | 244 |
A.1.1 Leere Anweisung | 244 |
A.1.2 Var-Anweisung | 244 |
A.1.3 Let-Anweisung | 244 |
A.1.4 Const-Anweisung | 244 |
A.1.5 Block-Anweisung | 245 |
A.1.6 Try-Catch-Finally-Block | 245 |
A.1.7 Throw-Anweisung | 245 |
A.1.8 Debugger-Anweisung | 245 |
A.1.9 Return-Anweisung | 246 |
A.2 Ausdrücke und Operatoren | 246 |
A.2.1 Ausdrücke | 246 |
A.2.2 Operatoren | 246 |
A.3 Kontrollstrukturen | 250 |
A.3.1 If-Else-Anweisung | 250 |
A.3.2 Switch-Case-Anweisung | 250 |
A.3.3 While-Anweisung | 251 |
A.3.4 Repeat-Until-Anweisung | 251 |
A.3.5 Do-While-Anweisung | 251 |
A.3.6 For-Anweisung | 251 |
A.3.7 Label-Anweisung | 252 |
A.3.8 Break-Anweisung | 252 |
A.3.9 Continue-Anweisung | 253 |
A.4 Whitespaces | 253 |
A.5 Kommentare | 253 |
A.6 Werte | 254 |
A.7 Literale | 254 |
A.7.1 Number | 254 |
A.7.2 NaN | 254 |
A.7.3 Infinity | 255 |
A.7.4 Formatierung | 255 |
A.7.5 number.toFixed | 255 |
A.7.6 number.toPrecision | 255 |
A.7.7 number.toString | 255 |
A.7.8 number.toExponential | 255 |
A.7.9 parseInt | 256 |
A.7.10 parseFloat | 256 |
A.8 Strings | 256 |
A.9 Boolean | 256 |
A.10 Reguläre Ausdrücke | 257 |
A.11 Array | 257 |
A.12 Objektliterale | 258 |
B Objektreferenz | 260 |
B.1 Boolean | 260 |
B.1.1 Konstruktor | 260 |
B.1.2 Eigenschaften | 261 |
B.1.3 Methoden | 261 |
B.2 Number | 261 |
B.2.1 Konstruktor | 261 |
B.2.2 Eigenschaften | 262 |
B.2.3 Methoden | 262 |
B.3 String | 263 |
B.3.1 Konstruktor | 263 |
B.3.2 Eigenschaften | 264 |
B.3.3 Methoden | 264 |
B.4 Array | 269 |
B.4.1 Konstruktor | 269 |
B.4.2 Eigenschaften | 270 |
B.4.3 Methoden | 270 |
B.5 Date | 275 |
B.5.1 Konstruktor | 275 |
B.5.2 Methoden | 276 |
B.6 Math | 280 |
B.6.1 Konstruktor | 280 |
B.6.2 Konstanten | 280 |
B.6.3 Rundungsfunktionen | 281 |
B.6.4 Filterfunktionen | 281 |
B.6.5 Trigonometrische Funktionen | 281 |
B.6.6 Logarithmische Funktionen | 282 |
B.6.7 Sonstige Funktionen | 283 |
B.7 RegExp | 283 |
B.7.1 Konstruktor | 283 |
B.7.2 Zeichen | 283 |
B.7.3 Eigenschaften | 285 |
B.7.4 Methoden | 285 |
C Namen und Namenskonventionen | 288 |
D JavaScript-Laufzeitumgebungen installieren | 290 |
D.1 Rhino | 290 |
D.2 TraceMonkey | 291 |
D.3 Google V8 | 292 |
E Literatur | 294 |
Index | 296 |