JavaScript objektorientiert - Verständlicher, flexibler und effizienter programmieren

von: Nicholas C. Zakas

dpunkt, 2014

ISBN: 9783864915543 , 136 Seiten

Format: PDF, ePUB, OL

Kopierschutz: Wasserzeichen

Windows PC,Mac OSX für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Apple iPod touch, iPhone und Android Smartphones Online-Lesen für: Windows PC,Mac OSX,Linux

Preis: 19,95 EUR

Mehr zum Inhalt

JavaScript objektorientiert - Verständlicher, flexibler und effizienter programmieren


 

2 Primitive Typen und Referenztypen


Die meisten Entwickler steigen in die objektorientierte Programmierung mit klassenbasierten Sprachen wie Java oder C# ein. Das anschließende Erlernen von JavaScript kann dann allerdings für Verwirrung sorgen, da JavaScript keine formale Unterstützung für Klassen bietet. Anstatt zu Anfang erst die Klassen zu definieren, können Sie in JavaScript einfach damit beginnen, Code zu schreiben, und legen die Datenstrukturen nur bei Bedarf an. Aus Mangel an Klassen gibt es in JavaScript auch keine Möglichkeiten zur Gruppierung von Klassen wie etwa Pakete. In Sprachen wie Java legen die Paket- und Klassennamen sowohl den Typ der Objekte fest, die Sie verwenden, als auch die Anordnung der Dateien und Ordner im Projekt. Bei der Programmierung in JavaScript dagegen beginnen Sie ohne Vorgaben: Sie können die Elemente gliedern, wie Sie wollen. Manche Entwickler ahmen bewusst die Strukturen anderer Sprachen nach, während andere die Flexibilität von JavaScript ausnutzen und etwas völlig Neues erschaffen. Diese Wahlfreiheit kann Neulinge überfordern. Haben Sie sich aber erst einmal daran gewöhnt, werden Sie feststellen, dass JavaScript eine unglaublich flexible Sprache ist, die Sie ziemlich einfach an Ihre Vorlieben anpassen können.

Um den Übergang von herkömmlichen objektorientierten Sprachen zu erleichtern, sind Objekte ein zentrales Merkmal der Sprache. Fast alle Daten in JavaScript sind entweder Objekte oder durch Objekte zugänglich. Sogar Funktionen (bei denen Sie in anderen Sprachen sonst allerlei Verrenkungen anstellen müssen, um Verweise darauf zu erhalten) werden in JavaScript als Objekte dargestellt, was sie zu Funktionen erster Klasse macht.

Um JavaScript verstehen zu können, ist es von entscheidender Bedeutung, sich mit Objekten auszukennen und mit ihnen zu arbeiten. Sie können jederzeit Objekte erstellen und ihnen Eigenschaften hinzufügen oder von ihnen entfernen. Außerdem sind JavaScript-Objekte äußerst flexibel und erlauben es, einmalige und interessante Muster zu erzeugen, die in anderen Sprachen schlicht nicht möglich sind.

In diesem Kapitel geht es um die beiden wichtigsten Arten von Datentypen von JavaScript, nämliche primitive Typen und Referenztypen. Der Zugriff auf beide erfolgt über Objekte, doch es ist wichtig, ihr unterschiedliches Verhalten zu verstehen.

2.1 Was sind Typen?


In JavaScript gibt es zwar das Konzept der Klassen nicht, aber es werden zwei Arten von Typen verwendet, primitive Typen und Referenztypen. Primitive Typen werden als einfache Datentypen gespeichert, Referenztypen als Objekte. Letztere sind eigentlich nur Verweise auf Stellen im Arbeitsspeicher.

Das Knifflige daran ist, dass Sie primitive Typen in JavaScript wie Referenztypen behandeln können. Diese Möglichkeit dient dazu, die Sprache für den Entwickler konsistenter erscheinen zu lassen.

In anderen Sprachen wird zwischen primitiven Typen und Referenztypen dadurch unterschieden, dass Erstere auf dem Stack und Letztere auf dem Heap gespeichert werden. JavaScript gibt dieses Prinzip ganz auf und verfolgt Variablen für einen gegebenen Gültigkeitsbereich mit einem Variablenobjekt. Primitive Objekte werden direkt in dem Variablenobjekt gespeichert, Referenzwerte dagegen als Zeiger, der auf die Stelle im Arbeitsspeicher verweist, an der das eigentliche Objekt abgelegt ist. Wie Sie im weiteren Verlauf dieses Kapitels allerdings noch sehen werden, verhalten sich primitive Werte und Referenzwerte sehr unterschiedlich, auch wenn sie auf den ersten Blick gleich aussehen mögen.

Darüber hinaus gibt es natürlich noch andere Unterschiede zwischen primitiven Typen und Referenztypen.

2.2 Primitive Typen


Primitive Typen stehen für einfache Daten, die im Originalzustand gespeichert werden, also z.B. true und 25. In JavaScript gibt es fünf primitive Typen:

Boolesche Werte

true oder false

Zahlen

Numerische Integer- und Fließkommawerte

Strings

Einzelne Zeichen oder Zeichenfolgen, die in einfache oder doppelte Anführungszeichen eingeschlossen sind (in JavaScript gibt es keinen eigenen Zeichentyp)

null

Ein primitiver Typ, der nur einen Wert hat, nämlich null

Nicht definiert

Ein primitiver Typ, der nur einen Wert hat, nämlich undefined (dies ist der Wert, der einer nicht initialisierten Variablen zugewiesen wird)

Die ersten drei Typen (boolesche Werte, Zahlen und Strings) verhalten sich gleichartig, die beiden letzten (null und undefined) dagegen weisen ein paar Besonderheiten auf, wie wir in diesem Kapitel noch sehen werden. Alle primitiven Typen aber besitzen eine Literaldarstellung ihrer Werte. Literale stellen Werte dar, die nicht in einer Variablen gespeichert sind, z.B. hartcodierte Namen oder Preisangaben. Die folgenden Beispiele zeigen die Verwendung der Literalform für die einzelnen Typen:

// Strings
var name = "Nicholas";
var selection = "a";

// Zahlen
var count = 25;
var cost = 1.51;

// Boolesche Werte
var found = true;

// NULL
var object = null;

// Nicht definiert
var flag = undefined;
var ref; // undefined wird automatisch zugewiesen

In JavaScript – wie in vielen anderen Sprachen auch – enthält eine Variable mit einem primitiven Datentyp unmittelbar den primitiven Wert (statt eines Zeigers auf ein Objekt). Wenn Sie einer Variablen einen primitiven Wert zuweisen, wird dieser Wert in die Variable kopiert. Wenn Sie eine Variable mit einer anderen gleichsetzen, erhalten die beiden daher jeweils ihre eigene Kopie der Daten. Betrachten Sie dazu das folgende Beispiel:

var color1 = "red";
var color2 = color1;

Hier wird color1 der Wert "red" zugewiesen. Anschließend wird der Variablen color2 der Wert color1 zugewiesen, wodurch "red" in color2 gespeichert wird. color1 und color2 enthalten zwar den gleichen Wert, sind aber völlig voneinander getrennt. Wenn Sie den Wert in color1 ändern, hat das keinerlei Auswirkungen auf color2 und umgekehrt. Das liegt daran, dass jede Variable ihren eigenen Speicherort hat. Abbildung 2–1 zeigt das Variablenobjekt für diesen Code.

Variablenobjekt

color1

"red"

color2

"red"

Abb. 2–1 Ein Variablenobjekt

Da jede Variable, die einen primitiven Wert enthält, ihren eigenen Speicherort aufweist, wirken sich Änderungen an der einen Variablen nicht auf die andere aus:

var color1 = "red";
var color2 = color1;

console.log(color1); // "red"
console.log(color2); // "red"

color1 = "blue";

console.log(color1); // "blue"
console.log(color2); // "red"

In diesem Code wird color1 in "blue" geändert, während color2 den ursprünglichen Wert "red" beibehält.

2.2.1 Primitive Typen identifizieren

Die beste Möglichkeit zur Identifizierung primitiver Typen bietet der Operator typeof. Er lässt sich auf jede Variable anwenden und gibt einen String zurück, der den Datentyp beschreibt. Das funktioniert sehr gut bei Strings, Zahlen, booleschen Werten und undefined. Die folgenden Beispiele zeigen die Ausgabe von typeof bei verschiedenen primitiven Werten:

console.log(typeof "Nicholas"); // "string"
console.log(typeof 10);         // "number"
console.log(typeof 5.1);        // "number"
console.log(typeof true);       // "boolean"
console.log(typeof undefined);  // "undefined"

Wie zu erwarten war, gibt typeof bei einem Stringwert "string" zurück, bei einer Zahl "number" (unabhängig davon, ob es sich um einen Integer oder eine Fließkommazahl handelt), bei einem booleschen Wert "boolean" und bei einem nicht definierten...