Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Funktion: prototype
Dieprototype Daten-Eigenschaft einerFunction-Instanz wird verwendet, wenn die Funktion als Konstruktor mit demnew-Operator verwendet wird. Sie wird das Prototyp-Objekt des neuen Objekts.
Hinweis:Nicht alleFunction-Objekte haben dieprototype-Eigenschaft — sieheBeschreibung.
In diesem Artikel
Wert
Ein Objekt.
Eigenschaften vonFunktion: prototype | |
|---|---|
| Schreibbar | ja |
| Aufzählbar | nein |
| Konfigurierbar | nein |
Hinweis:Klassen sind eine Art von Funktion, daher gilt das meiste der hier beschriebenen Konzepte auch für dieprototype-Eigenschaft von Klassen. Der einzige wesentliche Unterschied ist, dass dieprototype-Eigenschaft einer Klasse nicht beschreibbar ist.
Beschreibung
Wenn eine Funktion mitnew aufgerufen wird, wird dieprototype-Eigenschaft des Konstruktors das Prototyp-Objekt des resultierenden Objekts.
function Ctor() {}const inst = new Ctor();console.log(Object.getPrototypeOf(inst) === Ctor.prototype); // trueSie könnenVererbung und die Prototypkette lesen, um mehr über die Interaktionen zwischen derprototype-Eigenschaft einer Konstruktorfunktion und dem Prototyp-Objekt des resultierenden Objekts zu erfahren.
Es reicht nicht aus, dass eine Funktion eineprototype-Eigenschaft hat, damit sie als Konstruktor in Frage kommt.Generatorfunktionen haben eineprototype-Eigenschaft, können aber nicht mitnew aufgerufen werden:
async function* asyncGeneratorFunction() {}function* generatorFunction() {}Stattdessen wird dieprototype-Eigenschaft von Generatorfunktionen verwendet, wenn sieohnenew aufgerufen werden. Dieprototype-Eigenschaft wird das Prototyp-Objekt des zurückgegebenenGenerator-Objekts.
Zusätzlich können einige Funktionen eineprototype-Eigenschaft haben, werfen jedoch bedingungslos einen Fehler, wenn sie mitnew aufgerufen werden. Zum Beispiel werfen dieSymbol()- undBigInt()-Funktionen einen Fehler, wenn sie mitnew aufgerufen werden, daSymbol.prototype undBigInt.prototype nur Methoden für die primitiven Werte bereitstellen sollen, aber die Wrapper-Objekte nicht direkt konstruiert werden sollten.
Folgende Funktionen haben keinprototype und sind daher nicht als Konstruktoren geeignet, auch wenn später manuell eineprototype-Eigenschaft zugewiesen wird:
const method = { foo() {} }.foo;const arrowFunction = () => {};async function asyncFunction() {}Folgende sind gültige Konstruktoren, dieprototype haben:
class Class {}function fn() {}Einegebundene Funktion hat keineprototype-Eigenschaft, kann aber dennoch konstruierbar sein. Wenn sie konstruiert wird, wird stattdessen die Ziel-Funktion konstruiert, und wenn die Ziel-Funktion konstruierbar ist, würde sie eine normale Instanz zurückgeben.
const boundFunction = function () {}.bind(null);Dieprototype-Eigenschaft einer Funktion ist standardmäßig ein einfaches Objekt mit einer Eigenschaft:constructor, die ein Verweis auf die Funktion selbst ist. Dieconstructor-Eigenschaft ist beschreibbar, nicht aufzählbar und konfigurierbar.
Wenn dasprototype einer Funktion mit etwas anderem als einemObject neu zugewiesen wird, würde bei einem Aufruf der Funktion mitnew das zurückgegebene ObjektObject.prototype als Prototyp haben. (Mit anderen Worten,new ignoriert dieprototype-Eigenschaft und konstruiert ein einfaches Objekt.)
function Ctor() {}Ctor.prototype = 3;console.log(Object.getPrototypeOf(new Ctor()) === Object.prototype); // trueBeispiele
>Ändern des Prototyps aller Instanzen durch Mutieren der Prototyp-Eigenschaft
function Ctor() {}const p1 = new Ctor();const p2 = new Ctor();Ctor.prototype.prop = 1;console.log(p1.prop); // 1console.log(p2.prop); // 1Hinzufügen einer Nicht-Methoden-Eigenschaft zur Prototyp-Eigenschaft einer Klasse
Klassenfelder fügen jeder Instanz Eigenschaften hinzu. Klassenmethoden deklarierenFunktions-Eigenschaften auf dem Prototyp. Es gibt jedoch keinen Weg, eine Nicht-Funktions-Eigenschaft zum Prototyp hinzuzufügen. Wenn Sie statische Daten zwischen allen Instanzen teilen möchten (zum Beispiel istError.prototype.name bei allen Fehlerinstanzen gleich), können Sie sie manuell derprototype-Eigenschaft einer Klasse zuweisen.
class Dog { constructor(name) { this.name = name; }}Dog.prototype.species = "dog";console.log(new Dog("Jack").species); // "dog"Dies kann ergonomischer gemacht werden durchstatische Initialisierungsblöcke, die beim Initialisieren der Klasse aufgerufen werden.
class Dog { static { Dog.prototype.species = "dog"; } constructor(name) { this.name = name; }}console.log(new Dog("Jack").species); // "dog"Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-function-instances-prototype> |