Funktion: prototype

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

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

Wert

Ein Objekt.

Eigenschaften von Funktion: prototype
Schreibbarja
Aufzählbarnein
Konfigurierbarnein

Hinweis:>Klassen sind eine Art von Funktion, daher ist der größte Teil der Beschreibung hier auch auf die prototype-Eigenschaft von Klassen anwendbar. Der einzige wesentliche Unterschied besteht darin, dass die prototype-Eigenschaft einer Klasse nicht beschreibbar ist.

Beschreibung

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

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

Weitere Informationen über die Interaktionen zwischen der prototype-Eigenschaft einer Konstruktorfunktion und dem Prototyp des resultierenden Objekts finden Sie in Vererbung und die Prototyp-Kette.

Dass eine Funktion eine prototype-Eigenschaft besitzt, reicht nicht aus, um sie als Konstruktor zu qualifizieren. Generator-Funktionen haben eine prototype-Eigenschaft, können jedoch nicht mit new aufgerufen werden:

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

Stattdessen wird die prototype-Eigenschaft von Generator-Funktionen verwendet, wenn sie ohne new aufgerufen werden. Die prototype-Eigenschaft wird zum Prototyp des zurückgegebenen Generator-Objekts.

Darüber hinaus können einige Funktionen eine prototype-Eigenschaft haben, aber bedingungslos eine Ausnahme auslösen, wenn sie mit new aufgerufen werden. Zum Beispiel lösen die Symbol()- und BigInt()-Funktionen eine Ausnahme aus, wenn sie mit new aufgerufen werden, da Symbol.prototype und BigInt.prototype nur dazu gedacht sind, Methoden für die primitiven Werte bereitzustellen, aber die Wrapper-Objekte sollten nicht direkt konstruiert werden.

Die folgenden Funktionen haben keine prototype-Eigenschaft und sind daher nicht als Konstruktoren geeignet, selbst wenn später manuell eine prototype-Eigenschaft zugewiesen wird:

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

Die folgenden sind gültige Konstruktoren, die eine prototype-Eigenschaft haben:

js
class Class {}
function fn() {}

Eine gebundene Funktion hat keine prototype-Eigenschaft, kann aber konstruierbar sein. Wenn sie konstruiert wird, wird die Zielfunktion konstruiert, und wenn die Zielfunktion konstruierbar ist, würde sie eine normale Instanz zurückgeben.

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

Die prototype-Eigenschaft einer Funktion ist standardmäßig ein einfaches Objekt mit einer Eigenschaft: constructor, die eine Referenz auf die Funktion selbst ist. Die constructor-Eigenschaft ist beschreibbar, nicht aufzählbar und konfigurierbar.

Wenn der prototype einer Funktion mit etwas anderem als einem Object neu zugewiesen wird, würde der Prototyp des zurückgegebenen Objekts Object.prototype sein, wenn die Funktion mit new aufgerufen wird. (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

Den Prototyp aller Instanzen ändern, indem die Prototyp-Eigenschaft verändert wird

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

Eine Nicht-Methoden-Eigenschaft zur Prototyp-Eigenschaft einer Klasse hinzufügen

Klassenfelder fügen jeder Instanz Eigenschaften hinzu. Klassenmethoden deklarieren Funktions-eigenschaften am Prototyp. Es gibt jedoch keine Möglichkeit, eine Nicht-Funktions-Eigenschaft zum Prototyp hinzuzufügen. Wenn Sie statische Daten zwischen allen Instanzen teilen möchten (zum Beispiel ist Error.prototype.name bei allen Fehlerinstanzen gleich), können Sie diese manuell dem prototype einer Klasse zuweisen.

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

Dog.prototype.species = "dog";

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

Dies kann durch die Verwendung von statischen Initialisierungsblöcken ergonomischer gemacht werden, die aufgerufen werden, wenn die Klasse initialisiert wird.

js
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

Siehe auch