| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Classes | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Mrz 2016 browserbergreifend verfgbar.
Klassen sind eine Vorlage zur Erstellung von Objekten. Sie kapseln Daten mit Code, um mit diesen Daten zu arbeiten. Klassen in JS basieren auf Prototypen, haben jedoch auch einige Syntax- und Semantikmerkmale, die einzigartig fr Klassen sind.
Fr mehr Beispiele und Erklrungen siehe den Leitfaden zur Verwendung von Klassen.
Klassen sind tatschlich "besondere Funktionen", und genauso wie Sie Funktionsausdrcke und Funktionsdeklarationen definieren knnen, kann eine Klasse auf zwei Arten definiert werden: ein Klassen-Ausdruck oder eine Klassen-Deklaration.
// Declaration
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
// Expression; the class is anonymous but assigned to a variable
const Rectangle = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
// Expression; the class has its own name
const Rectangle = class Rectangle2 {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
Wie Funktionsausdrcke knnen Klassen-Ausdrcke anonym sein oder einen Namen haben, der von der Variablen, der sie zugewiesen sind, abweicht. Anders als Funktionsdeklarationen haben Klassendeklarationen jedoch die gleichen Einschrnkungen der temporal dead zone wie let oder const und verhalten sich, als ob sie nicht gehoben wrden.
Der Krper einer Klasse ist der Teil, der in geschweiften Klammern {} steht. Hier definieren Sie Klassenmitglieder, wie Methoden oder Konstruktor.
Der Krper einer Klasse wird im strict mode ausgefhrt, auch ohne die "use strict"-Direktive.
Ein Klassenelement kann durch drei Aspekte charakterisiert werden:
Zusammen ergeben sie 16 mgliche Kombinationen. Um die Referenz logischer zu unterteilen und berlappenden Inhalt zu vermeiden, werden die verschiedenen Elemente detailliert auf verschiedenen Seiten vorgestellt:
ffentliche Instanzmethode
ffentlicher Instanzgetter
ffentlicher Instanzsetter
ffentliches Instanzfeld
staticffentliche statische Methode, Getter, Setter und Feld
Alles, was privat ist
Hinweis: Private Elemente unterliegen der Einschrnkung, dass alle in derselben Klasse deklarierten privaten Namen eindeutig sein mssen. Alle anderen ffentlichen Eigenschaften unterliegen dieser Einschrnkung nicht Sie knnen mehrere ffentliche Eigenschaften mit demselben Namen haben, wobei die letzte die anderen berschreibt. Dies ist dasselbe Verhalten wie bei Objektinitialisierern.
Zustzlich gibt es zwei spezielle Klassenelement-Syntaxen: constructor und statische Initialisierungsblcke, mit ihren eigenen Referenzen.
Die constructor-Methode ist eine spezielle Methode zum Erstellen und Initialisieren eines mit einer Klasse erstellten Objekts. Es kann nur eine spezielle Methode mit dem Namen "constructor" in einer Klasse geben es wird ein SyntaxError geworfen, wenn die Klasse mehr als eine constructor-Methode enthlt.
Ein Konstruktor kann das super-Schlsselwort verwenden, um den Konstruktor der Superklasse aufzurufen.
Sie knnen Instanzeigenschaften innerhalb des Konstruktors erstellen:
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Alternativ, wenn die Werte Ihrer Instanzeigenschaften nicht von den Argumenten des Konstruktors abhngen, knnen Sie sie als Klassenfelder definieren.
Statische Initialisierungsblcke ermglichen eine flexible Initialisierung von statischen Eigenschaften, einschlielich der Auswertung von Anweisungen whrend der Initialisierung, whrend der Zugriff auf den privaten Bereich gewhrt wird.
Mehrere statische Blcke knnen deklariert werden und diese knnen mit der Deklaration von statischen Feldern und Methoden verknpft werden (alle statischen Elemente werden in der Deklarationsreihenfolge ausgewertet).
Methoden werden auf dem Prototyp jeder Klasseninstanz definiert und allen Instanzen gemeinsam genutzt. Methoden knnen einfache Funktionen, asynchrone Funktionen, Generatorfunktionen oder asynchrone Generatorfunktionen sein. Fr weitere Informationen siehe Methodendefinitionen.
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// Method
calcArea() {
return this.height * this.width;
}
*getSides() {
yield this.height;
yield this.width;
yield this.height;
yield this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
console.log([...square.getSides()]); // [10, 10, 10, 10]
Das static-Schlsselwort definiert eine statische Methode oder ein Feld fr eine Klasse. Statische Eigenschaften (Felder und Methoden) sind an der Klasse selbst statt an jeder Instanz definiert. Statische Methoden werden hufig verwendet, um Utility-Funktionen fr eine Anwendung zu erstellen, whrend statische Felder ntzlich fr Caches, feste Konfigurationen oder andere Daten sind, die nicht ber Instanzen hinweg dupliziert werden mssen.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static displayName = "Point";
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.hypot(dx, dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance; // undefined
p2.displayName; // undefined
p2.distance; // undefined
console.log(Point.displayName); // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
Mit der Klassenfelddeklarationssyntax kann das Konstruktor-Beispiel wie folgt geschrieben werden:
class Rectangle {
height = 0;
width;
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Klassenfelder hneln Objekt-Eigenschaften, nicht Variablen, daher verwenden wir keine Schlsselwrter wie const, um sie zu deklarieren. In JavaScript verwenden private Elemente eine spezielle Bezeichnersyntax, daher sollten Modifikatorschlsselwrter wie public und private ebenfalls nicht verwendet werden.
Wie oben gezeigt, knnen die Felder mit oder ohne Standardwert deklariert werden. Felder ohne Standardwerte haben standardmig undefined. Durch die frhzeitige Deklaration der Felder werden Klassendefinitionen selbstdokumentierender, und die Felder sind immer vorhanden, was Optimierungen erleichtert.
Siehe ffentliche Klassenfelder fr weitere Informationen.
Mit privaten Feldern kann die Definition wie folgt verfeinert werden.
class Rectangle {
#height = 0;
#width;
constructor(height, width) {
this.#height = height;
this.#width = width;
}
}
Es ist ein Fehler, von auerhalb der Klasse auf private Felder zu verweisen; sie knnen nur innerhalb des Klassenkrpers gelesen oder geschrieben werden. Indem Sie Dinge definieren, die auerhalb der Klasse nicht sichtbar sind, stellen Sie sicher, dass die Benutzer Ihrer Klassen nicht von internen Details abhngen knnen, die sich von Version zu Version ndern knnen.
Private Felder knnen nur im Voraus in einer Felderklrung deklariert werden. Sie knnen nicht spter durch Zuweisung zu ihnen erstellt werden, wie es bei normalen Eigenschaften der Fall ist.
Private Methoden und Zugriffsmethoden knnen ebenfalls unter Verwendung derselben Syntax wie ihre ffentlichen Gegenstcke definiert werden, jedoch beginnt der Bezeichner mit #.
Fr weitere Informationen siehe private Elemente.
Das extends-Schlsselwort wird in Klassendeklarationen oder Klassenausdrcken verwendet, um eine Klasse als Kind eines anderen Konstruktors (entweder eine Klasse oder eine Funktion) zu erstellen.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // call the super class constructor and pass in the name parameter
}
speak() {
console.log(`${this.name} barks.`);
}
}
const d = new Dog("Mitzie");
d.speak(); // Mitzie barks.
Wenn im Unterklasse ein Konstruktor vorhanden ist, muss er zuerst super() aufrufen, bevor er this verwendet. Das super-Schlsselwort kann auch verwendet werden, um entsprechende Methoden der Superklasse aufzurufen.
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Lion extends Cat {
speak() {
super.speak();
console.log(`${this.name} roars.`);
}
}
const l = new Lion("Fuzzy");
l.speak();
// Fuzzy makes a noise.
// Fuzzy roars.
Wenn eine class Deklaration oder ein class Ausdruck ausgewertet wird, werden seine verschiedenen Komponenten in der folgenden Reihenfolge ausgewertet:
extends-Klausel, falls vorhanden, wird zuerst ausgewertet. Sie muss zu einer gltigen Konstruktorfunktion oder null ausgewertet werden, andernfalls wird ein TypeError geworfen.constructor-Methode wird extrahiert, mit einer Standardimplementierung ersetzt, wenn constructor nicht vorhanden ist. Da die constructor-Definition jedoch nur eine Methodendefinition ist, ist dieser Schritt nicht beobachtbar.this auf den umgebenden Wert this der Klasse gesetzt wird (nicht die Klasse selbst). Keine der Eigenschaftswerte wird bisher ausgewertet.prototype Eigenschaft der aktuellen Klasse installiert, und statische Methoden und Zugriffsmethoden werden auf der Klasse selbst installiert. Private Instanzmethoden und Zugriffsmethoden werden gespeichert, um spter direkt auf der Instanz installiert zu werden. Dieser Schritt ist nicht beobachtbar.extends angegebenen Prototyp und der durch constructor angegebenen Implementierung initialisiert. Bei allen obigen Schritten, wenn ein ausgewerteter Ausdruck versucht, auf den Namen der Klasse zuzugreifen, wird ein ReferenceError geworfen, da die Klasse noch nicht initialisiert ist.super()-Aufruf zurckkehrt (fr abgeleitete Klassen).this auf die Klasse selbst gesetzt ausgewertet und die Eigenschaft wird auf der Klasse erstellt.this auf die Klasse selbst gesetzt ausgewertet.Fr die Erstellung von Instanzen siehe die constructor-Referenz.
Wenn eine statische oder Instanzmethode ohne Wert fr this aufgerufen wird, z. B. durch Zuweisung der Methode zu einer Variablen und anschlieendem Aufruf, ist der this-Wert innerhalb der Methode undefined. Dieses Verhalten ist dasselbe, auch wenn die "use strict"-Direktive nicht vorhanden ist, da der Code innerhalb des class-Krpers immer im strict mode ausgefhrt wird.
class Animal {
speak() {
return this;
}
static eat() {
return this;
}
}
const obj = new Animal();
obj.speak(); // the Animal object
const speak = obj.speak;
speak(); // undefined
Animal.eat(); // class Animal
const eat = Animal.eat;
eat(); // undefined
Wenn wir das oben Genannte unter Verwendung traditioneller funktionsbasierter Syntax im nicht-strict mode umschreiben, werden this-Methodenaufrufe automatisch an globalThis gebunden. Im strict mode bleibt der Wert von this als undefined.
function Animal() {}
Animal.prototype.speak = function () {
return this;
};
Animal.eat = function () {
return this;
};
const obj = new Animal();
const speak = obj.speak;
speak(); // global object (in nonstrict mode)
const eat = Animal.eat;
eat(); // global object (in non-strict mode)
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-class-definitions |
classclass AusdruckDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |