Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. Objekt
  6. setPrototypeOf()

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

View in EnglishAlways switch to English

Object.setPrototypeOf()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨September 2015⁩.

DieObject.setPrototypeOf() statische Methode setzt das Prototyp (d.h. die interne[[Prototype]]-Eigenschaft) eines angegebenen Objekts auf ein anderes Objekt odernull.

Warnung:Das Ändern des[[Prototype]] eines Objekts ist aufgrund der Art und Weise, wie moderne JavaScript-Engines Eigenschaftszugriffe optimieren, derzeit eine sehr langsame Operation in jedem Browser und JavaScript-Engine. Darüber hinaus sind die Auswirkungen der Änderung der Vererbung subtil und weitreichend und beschränken sich nicht nur auf die Zeit, die in derObject.setPrototypeOf(...)-Anweisung verbracht wird, sondern können sich aufjeden Code erstrecken, der auf ein Objekt zugreift, dessen[[Prototype]] verändert wurde. Mehr dazu können Sie unterJavaScript-Engine-Grundlagen: Optimierung von Prototypen lesen.

Da dieses Feature Teil der Sprache ist, liegt es weiterhin in der Verantwortlichkeit der Engine-Entwickler, dieses Feature performant zu implementieren (idealerweise). Bis die Engine-Entwickler dieses Problem lösen, sollten Sie, wenn Ihnen die Leistung wichtig ist, es vermeiden, das[[Prototype]] eines Objekts zu setzen. Stattdessen sollten Sie ein neues Objekt mit dem gewünschten[[Prototype]] unter Verwendung vonObject.create() erstellen.

Probieren Sie es aus

const obj = {};const parent = { foo: "bar" };console.log(obj.foo);// Expected output: undefinedObject.setPrototypeOf(obj, parent);console.log(obj.foo);// Expected output: "bar"

Syntax

js
Object.setPrototypeOf(obj, prototype)

Parameter

obj

Das Objekt, dessen Prototyp gesetzt werden soll.

prototype

Der neue Prototyp des Objekts (ein Objekt odernull).

Rückgabewert

Das angegebene Objekt.

Ausnahmen

TypeError

Wird in einem der folgenden Fälle ausgelöst:

  • Derobj-Parameter istundefined odernull.
  • Derobj-Parameter istnicht erweiterbar oder es handelt sich um einunveränderliches Prototyp-exotisches Objekt, wieObject.prototype oderwindow. Die Fehlermeldung wird jedoch nicht ausgelöst, wenn der neue Prototyp denselben Wert hat wie der ursprüngliche Prototyp vonobj.
  • Derprototype-Parameter ist kein Objekt odernull.

Beschreibung

Object.setPrototypeOf() wird allgemein als der richtige Weg angesehen, den Prototyp eines Objekts zu setzen. Sie sollten es immer zugunsten des veraltetenObject.prototype.__proto__-Zugriffs verwenden.

Wenn derobj-Parameter kein Objekt ist (z.B. Zahl, Zeichenkette, etc.), führt diese Methode keine Aktion durch — ohne es in ein Objekt umzuwandeln oder zu versuchen, dessen Prototyp zu setzen — und gibtobj direkt als primitiven Wert zurück. Wennprototype denselben Wert hat wie der Prototyp vonobj, dann wirdobj direkt zurückgegeben, ohne dass einTypeError verursacht wird, selbst wennobj ein unveränderlicher Prototyp ist.

Aus Sicherheitsgründen gibt es bestimmte integrierte Objekte, die so konzipiert sind, dass sie einenunveränderlichen Prototyp haben. Dies verhindertPrototype-Pollution-Angriffe, insbesondere [proxy-bezogene] (https://github.com/tc39/ecma262/issues/272). Die Kernsprache gibt nurObject.prototype als ein unveränderliches Prototyp-exotisches Objekt an, dessen Prototyp immernull ist. In Browsern sindwindow undlocation zwei weitere sehr häufige Beispiele.

js
Object.isExtensible(Object.prototype); // true; you can add more propertiesObject.setPrototypeOf(Object.prototype, {}); // TypeError: Immutable prototype object '#<Object>' cannot have their prototype setObject.setPrototypeOf(Object.prototype, null); // No error; the prototype of `Object.prototype` is already `null`

Beispiele

Pseudo-klassische Vererbung mit Object.setPrototypeOf()

Vererbung in JS unter Verwendung von Klassen.

js
class Human {}class SuperHero extends Human {}const superMan = new SuperHero();

Wenn wir jedoch Unterklassen ohne Verwendung vonclass implementieren wollen, können wir Folgendes tun:

js
function Human(name, level) {  this.name = name;  this.level = level;}function SuperHero(name, level) {  Human.call(this, name, level);}Object.setPrototypeOf(SuperHero.prototype, Human.prototype);// Set the `[[Prototype]]` of `SuperHero.prototype`// to `Human.prototype`// To set the prototypal inheritance chainHuman.prototype.speak = function () {  return `${this.name} says hello.`;};SuperHero.prototype.fly = function () {  return `${this.name} is flying.`;};const superMan = new SuperHero("Clark Kent", 1);console.log(superMan.fly());console.log(superMan.speak());

Die Ähnlichkeit zwischen klassischer Vererbung (mit Klassen) und pseudo-klassischer Vererbung (mitprototype-Eigenschaft von Konstruktoren), wie oben dargestellt, wird inVererbungsketten erwähnt.

Da dieprototype-Eigenschaft von Funktionskonstruktoren schreibbar ist, können Sie sie einer neuen mitObject.create() erstellten Objekt zuweisen, um dieselbe Vererbungskette zu erreichen. Es gibt jedoch Vorbehalte zu beachten, wenn Siecreate() verwenden, wie z. B. das Erinnern daran, dieconstructor-Eigenschaft erneut hinzuzufügen.

Im folgenden Beispiel, das ebenfalls Klassen verwendet, wirdSuperHero so gestaltet, dass es vonHuman erbt, ohneextends zu verwenden, indem stattdessensetPrototypeOf() verwendet wird.

Warnung:Es ist nicht ratsam,setPrototypeOf() anstelle vonextends zu verwenden, aus Leistungs- und Lesbarkeitsgründen.

js
class Human {}class SuperHero {}// Set the instance propertiesObject.setPrototypeOf(SuperHero.prototype, Human.prototype);// Hook up the static propertiesObject.setPrototypeOf(SuperHero, Human);const superMan = new SuperHero();

Die Unterklassenbildung ohneextends wird im AbschnittES-6-Unterklassenbildung erwähnt.

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-object.setprototypeof

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp