[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype [Back]  [Original]

Funktion: prototype - JavaScript | MDN

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

Funktion: prototype

Die prototype Daten-Eigenschaft einer Function-Instanz wird verwendet, wenn die Funktion als Konstruktor mit dem new-Operator verwendet wird. Sie wird das Prototyp-Objekt des neuen Objekts.

Hinweis: Nicht alle Function-Objekte haben die prototype-Eigenschaft siehe Beschreibung.

In diesem Artikel

Wert

Ein Objekt.

Eigenschaften von Funktion: prototype
Schreibbarja
Aufzhlbarnein
Konfigurierbarnein

Hinweis: Klassen sind eine Art von Funktion, daher gilt das meiste der hier beschriebenen Konzepte auch fr die prototype-Eigenschaft von Klassen. Der einzige wesentliche Unterschied ist, dass die prototype-Eigenschaft einer Klasse nicht beschreibbar ist.

Beschreibung

Wenn eine Funktion mit new aufgerufen wird, wird die prototype-Eigenschaft des Konstruktors das Prototyp-Objekt des resultierenden Objekts.

js
function Ctor() {}
const inst = new Ctor();
console.log(Object.getPrototypeOf(inst) === Ctor.prototype); // true

Sie knnen Vererbung und die Prototypkette lesen, um mehr ber die Interaktionen zwischen der prototype-Eigenschaft einer Konstruktorfunktion und dem Prototyp-Objekt des resultierenden Objekts zu erfahren.

Es reicht nicht aus, dass eine Funktion eine prototype-Eigenschaft hat, damit sie als Konstruktor in Frage kommt. Generatorfunktionen haben eine prototype-Eigenschaft, knnen aber nicht mit new aufgerufen werden:

js
async function* asyncGeneratorFunction() {}
function* generatorFunction() {}

Stattdessen wird die prototype-Eigenschaft von Generatorfunktionen verwendet, wenn sie ohne new aufgerufen werden. Die prototype-Eigenschaft wird das Prototyp-Objekt des zurckgegebenen Generator-Objekts.

Zustzlich knnen einige Funktionen eine prototype-Eigenschaft haben, werfen jedoch bedingungslos einen Fehler, wenn sie mit new aufgerufen werden. Zum Beispiel werfen die Symbol()- und BigInt()-Funktionen einen Fehler, wenn sie mit new aufgerufen werden, da Symbol.prototype und BigInt.prototype nur Methoden fr die primitiven Werte bereitstellen sollen, aber die Wrapper-Objekte nicht direkt konstruiert werden sollten.

Folgende Funktionen haben kein prototype und sind daher nicht als Konstruktoren geeignet, auch wenn spter manuell eine prototype-Eigenschaft zugewiesen wird:

js
const method = { foo() {} }.foo;
const arrowFunction = () => {};
async function asyncFunction() {}

Folgende sind gltige Konstruktoren, die prototype haben:

js
class Class {}
function fn() {}

Eine gebundene Funktion hat keine prototype-Eigenschaft, kann aber dennoch konstruierbar sein. Wenn sie konstruiert wird, wird stattdessen die Ziel-Funktion konstruiert, und wenn die Ziel-Funktion konstruierbar ist, wrde sie eine normale Instanz zurckgeben.

js
const boundFunction = function () {}.bind(null);

Die prototype-Eigenschaft einer Funktion ist standardmig ein einfaches Objekt mit einer Eigenschaft: constructor, die ein Verweis auf die Funktion selbst ist. Die constructor-Eigenschaft ist beschreibbar, nicht aufzhlbar und konfigurierbar.

Wenn das prototype einer Funktion mit etwas anderem als einem Object neu zugewiesen wird, wrde bei einem Aufruf der Funktion mit new das zurckgegebene Objekt Object.prototype als Prototyp haben. (Mit anderen Worten, new ignoriert die prototype-Eigenschaft und konstruiert ein einfaches Objekt.)

js
function Ctor() {}
Ctor.prototype = 3;
console.log(Object.getPrototypeOf(new Ctor()) === Object.prototype); // true

Beispiele

ndern des Prototyps aller Instanzen durch Mutieren der Prototyp-Eigenschaft

js
function Ctor() {}
const p1 = new Ctor();
const p2 = new Ctor();
Ctor.prototype.prop = 1;
console.log(p1.prop); // 1
console.log(p2.prop); // 1

Hinzufgen einer Nicht-Methoden-Eigenschaft zur Prototyp-Eigenschaft einer Klasse

Klassenfelder fgen jeder Instanz Eigenschaften hinzu. Klassenmethoden deklarieren Funktions-Eigenschaften auf dem Prototyp. Es gibt jedoch keinen Weg, eine Nicht-Funktions-Eigenschaft zum Prototyp hinzuzufgen. Wenn Sie statische Daten zwischen allen Instanzen teilen mchten (zum Beispiel ist Error.prototype.name bei allen Fehlerinstanzen gleich), knnen Sie sie manuell der prototype-Eigenschaft einer Klasse zuweisen.

js
class Dog {
  constructor(name) {
    this.name = name;
  }
}

Dog.prototype.species = "dog";

console.log(new Dog("Jack").species); // "dog"

Dies kann ergonomischer gemacht werden durch statische Initialisierungsblcke, die beim Initialisieren der Klasse aufgerufen werden.

js
class Dog {
  static {
    Dog.prototype.species = "dog";
  }
  constructor(name) {
    this.name = name;
  }
}

console.log(new Dog("Jack").species); // "dog"

Spezifikationen

Spezifikation
ECMAScript 2027 LanguageSpecification
# sec-function-instances-prototype

Siehe auch


Web Proxy Viewer  |  New URL  |  Original Page