|
Inhalt |
7 |
|
|
Vorwort |
13 |
|
|
Zielgruppe dieses Buches |
13 |
|
|
Konventionen in diesem Buch |
14 |
|
|
Verwendung der Codebeispiele |
14 |
|
|
Danksagungen |
15 |
|
|
Quellen |
15 |
|
|
Leseempfehlungen |
15 |
|
|
Kapitel 1 – Einführung |
17 |
|
|
Muster |
17 |
|
|
JavaScript: Konzepte |
19 |
|
|
Objektorientiert |
19 |
|
|
Keine Klassen |
20 |
|
|
Prototypen |
20 |
|
|
Umgebung |
21 |
|
|
ECMAScript 5 |
21 |
|
|
JSLint |
22 |
|
|
Die Konsole |
22 |
|
|
Kapitel 2 – Grundlagen |
25 |
|
|
Wartbaren Code schreiben |
25 |
|
|
Wenige globale Variablen verwenden |
26 |
|
|
Das Problem mit globalen Variablen |
27 |
|
|
Nebenwirkungen eines vergessenen var |
28 |
|
|
Zugriff auf das globale Objekt |
29 |
|
|
Single-var-Muster |
30 |
|
|
Hoisting: Ein Problem mit verstreuten vars |
31 |
|
|
for-Schleifen |
32 |
|
|
for-in-Schleifen |
34 |
|
|
Eingebaute Prototypen (nicht) erweitern |
36 |
|
|
switch-Muster |
37 |
|
|
Implizite Typecasts vermeiden |
37 |
|
|
eval() vermeiden |
38 |
|
|
Zahlen umwandeln mit parseInt() |
39 |
|
|
Code-Richtlinien |
40 |
|
|
Einrücken |
40 |
|
|
Geschweifte Klammern |
41 |
|
|
Position der öffnenden Klammer |
42 |
|
|
Leerraum |
43 |
|
|
Namenskonventionen |
44 |
|
|
Konstruktoren mit Großbuchstaben beginnen |
45 |
|
|
Wörter trennen |
45 |
|
|
Andere Namens-Muster |
45 |
|
|
Kommentare schreiben |
47 |
|
|
Eine API-Dokumentation schreiben |
47 |
|
|
YUIDoc-Beispiel |
48 |
|
|
Schreiben, um gelesen zu werden |
51 |
|
|
Peer Reviews |
52 |
|
|
Minifizieren … in der Produktionsumgebung |
53 |
|
|
JSLint nutzen |
54 |
|
|
Zusammenfassung |
55 |
|
|
Kapitel 3 – Literale und Konstruktoren |
57 |
|
|
Objekt-Literale |
57 |
|
|
Die Objekt-Literal-Syntax |
58 |
|
|
Objekte aus einem Konstruktor |
59 |
|
|
Object-Konstruktor-Überraschung |
59 |
|
|
Eigene Konstruktor-Funktionen |
60 |
|
|
Rückgabewerte von Konstruktoren |
62 |
|
|
Muster zum Erzwingen von new |
62 |
|
|
Namenskonventionen |
63 |
|
|
that verwenden |
63 |
|
|
Selbst aufrufender Konstruktor |
64 |
|
|
Array-Literal |
65 |
|
|
Die Array-Literal-Syntax |
65 |
|
|
Kuriositäten im Array-Konstruktor |
65 |
|
|
Auf »Array-Haftigkeit« prüfen |
66 |
|
|
JSON |
67 |
|
|
Mit JSON arbeiten |
67 |
|
|
Regexp-Literal |
68 |
|
|
Regexp-Literal-Syntax |
69 |
|
|
Wrapper für Primitive |
70 |
|
|
Fehler-Objekte |
72 |
|
|
Zusammenfassung |
72 |
|
|
Kapitel 4 – Funktionen |
75 |
|
|
Hintergrund |
75 |
|
|
Mehrdeutige Terminologie |
76 |
|
|
Deklarationen versus Ausdrücke: Namen und Hoisting |
77 |
|
|
name-Eigenschaft von Function |
78 |
|
|
Funktions-Hoisting |
79 |
|
|
Callback-Muster |
81 |
|
|
Ein Callback-Beispiel |
81 |
|
|
Callbacks und Scope |
83 |
|
|
Asynchrone Event Listener |
84 |
|
|
Timeouts |
85 |
|
|
Callbacks in Bibliotheken |
85 |
|
|
Funktionen zurückgeben |
86 |
|
|
Selbst-definierende Funktionen |
86 |
|
|
Immediate Function |
88 |
|
|
Parameter einer Immediate Function |
89 |
|
|
Rückgabewerte aus Immediate Functions |
90 |
|
|
Vorteile und Anwendungsfälle |
91 |
|
|
Immediate-Object-Initialisierung |
92 |
|
|
Verzweigungen beim Initialisieren (Init-Time Branching) |
93 |
|
|
Funktions-Eigenschaften &ndash |
95 |
|
|
Konfigurations-Objekte |
96 |
|
|
Curry |
98 |
|
|
Anwenden einer Funktion |
98 |
|
|
Partielle Anwendung |
99 |
|
|
Currying |
100 |
|
|
Wann man Currying nutzt |
102 |
|
|
Zusammenfassung |
103 |
|
|
Kapitel 5 – Objekt-Erzeugungs-Muster |
105 |
|
|
Namensraum-Muster |
105 |
|
|
Namensraum-Funktion |
107 |
|
|
Abhängigkeiten deklarieren |
109 |
|
|
Private Eigenschaften und Methoden |
110 |
|
|
Private Member |
110 |
|
|
Bevorzugte Methoden |
111 |
|
|
Privacy-Lücken |
111 |
|
|
Objekt-Literale und Privacy |
113 |
|
|
Eigenschaften und Privacy |
113 |
|
|
Private Funktionen als öffentliche Methoden bereitstellen (Revelation-Muster) |
114 |
|
|
Modul-Muster |
115 |
|
|
Bereitstellungs-Modul-Muster |
117 |
|
|
Module, die Konstruktoren erzeugen |
118 |
|
|
Globale Variablen in ein Modul importieren |
119 |
|
|
Sandbox-Muster |
119 |
|
|
Ein globaler Konstruktor |
120 |
|
|
Module hinzufügen |
121 |
|
|
Den Konstruktor implementieren |
122 |
|
|
Statische Member |
124 |
|
|
Öffentliche statische Member |
124 |
|
|
Private statische Member |
126 |
|
|
Objekt-Konstanten |
127 |
|
|
Verkettungs-Muster |
129 |
|
|
Vor- und Nachteile des Verkettungs-Musters |
130 |
|
|
method()-Methode |
130 |
|
|
Zusammenfassung |
132 |
|
|
Kapitel 6 – Muster zum Wiederverwenden von Code |
133 |
|
|
Klassische versus moderne Vererbungs-Muster |
133 |
|
|
Erwartete Ergebnisse bei klassischer Vererbung |
134 |
|
|
Klassisches Muster Nr. 1 &ndash |
135 |
|
|
Der Prototypen-Kette folgen |
135 |
|
|
Nachteile bei Muster Nr. 1 |
138 |
|
|
Klassisches Muster Nr. 2 &ndash |
138 |
|
|
Die Prototypen-Kette |
139 |
|
|
Mehrfachvererbung bei geliehenen Konstruktoren |
140 |
|
|
Vor- und Nachteile des Geliehener-Konstruktor-Musters |
141 |
|
|
Klassisches Muster Nr. 3 &ndash |
141 |
|
|
Klassisches Muster Nr. 4 &ndash |
143 |
|
|
Klassisches Muster Nr. 5 &ndash |
144 |
|
|
Die Superklasse speichern |
145 |
|
|
Den Konstruktor-Zeiger zurücksetzen |
146 |
|
|
Klass |
147 |
|
|
Prototypische Vererbung |
149 |
|
|
Diskussion |
151 |
|
|
Ergänzung in ECMAScript 5 |
151 |
|
|
Vererbung durch das Kopieren von Eigenschaften |
152 |
|
|
Mix-Ins |
154 |
|
|
Methoden ausleihen |
155 |
|
|
Beispiel: Von Array ausleihen |
156 |
|
|
Ausleihen und Binden |
156 |
|
|
Function.prototype.bind() |
157 |
|
|
Zusammenfassung |
158 |
|
|
Kapitel 7 – Entwurfsmuster |
159 |
|
|
Singleton |
159 |
|
|
new verwenden |
160 |
|
|
Instanz in einer statischen Eigenschaft |
161 |
|
|
Instanz in einem Closure |
162 |
|
|
Fabrik/Factory |
164 |
|
|
Eingebaute Object-Fabrik |
166 |
|
|
Iterator |
167 |
|
|
Dekorierer/Decorator |
169 |
|
|
Anwendung |
169 |
|
|
Implementierung |
170 |
|
|
Implementierung mit einer Liste |
172 |
|
|
Strategie/Strategy |
174 |
|
|
Beispiel: Datenvalidierung |
174 |
|
|
Fassade/Faç |
177 |
|
|
Stellvertreter/Proxy |
178 |
|
|
Ein Beispiel |
179 |
|
|
Ein Video-Erweiterer |
179 |
|
|
Ohne Stellvertreter |
180 |
|
|
HTML |
180 |
|
|
Event Handler |
181 |
|
|
videos-Objekt |
182 |
|
|
http-Objekt |
183 |
|
|
Auftritt des Stellvertreters |
183 |
|
|
Stellvertreter als Cache |
186 |
|
|
Vermittler/Mediator |
186 |
|
|
Vermittler-Beispiel |
187 |
|
|
Beobachter/Observer |
190 |
|
|
Beispiel Nr. 1: Zeitungs-Subskription |
190 |
|
|
Beispiel Nr. 2: Das Tastatur-Spiel |
194 |
|
|
Zusammenfassung |
197 |
|
|
Kapitel 8 – DOM- und Browser-Muster |
199 |
|
|
Separation of Concerns |
199 |
|
|
DOM Scripting |
201 |
|
|
DOM-Zugriff |
201 |
|
|
Veränderungen am DOM |
202 |
|
|
Events |
204 |
|
|
Event Handling |
204 |
|
|
Event Delegation |
206 |
|
|
Langlaufende Skripten |
207 |
|
|
setTimeout() |
208 |
|
|
Web Workers |
208 |
|
|
Remote Scripting |
209 |
|
|
XMLHttpRequest |
209 |
|
|
JSONP |
211 |
|
|
JSONP-Beispiel: Tic-Tac-Toe |
211 |
|
|
Frames und Image Beacons |
214 |
|
|
JavaScript-Code ausliefern |
214 |
|
|
Skripten kombinieren |
214 |
|
|
Minifizieren und Komprimieren |
215 |
|
|
Expires-Header |
216 |
|
|
Ein CDN verwenden |
216 |
|
|
Strategien zum Laden |
216 |
|
|
Die Position des -Elements |
217 |
|
|
HTTP Chunking |
218 |
|
|
Dynamisches -Element für nicht-blockierende Downloads |
220 |
|
|
Das -Element anfügen |
221 |
|
|
Lazy-Loading |
221 |
|
|
Loading on Demand |
222 |
|
|
JavaScript im Voraus laden |
224 |
|
|
Zusammenfassung |
225 |
|
|
Index |
227 |
|