Object.prototype.__proto__

Veraltet: Diese Funktion wird nicht mehr empfohlen. Obwohl einige Browser sie möglicherweise noch unterstützen, kann sie bereits aus den relevanten Webstandards entfernt worden sein, befindet sich im Prozess der Entfernung oder wird nur aus Kompatibilitätsgründen beibehalten. Vermeiden Sie die Verwendung und aktualisieren Sie gegebenenfalls bestehenden Code; siehe die Kompatibilitätstabelle am Ende dieser Seite, um Ihre Entscheidung zu treffen. Beachten Sie, dass diese Funktion jederzeit nicht mehr funktionieren kann.

Warnung: Das Ändern des [[Prototype]] eines Objekts ist aufgrund der Optimierung von Eigenschaftszugriffen durch moderne JavaScript-Engines derzeit eine sehr langsame Operation in jedem Browser und JavaScript-Engine. Darüber hinaus sind die Auswirkungen der Vererbung subtil und weitreichend und beschränken sich nicht nur auf die Zeit, die mit der obj.__proto__ = ... Anweisung verbracht wird, sondern können sich auf jeglichen Code erstrecken, der auf ein Objekt zugreifen kann, dessen [[Prototype]] geändert wurde. Weitere Informationen finden Sie unter JavaScript engine fundamentals: optimizing prototypes.

Hinweis: Die Verwendung von __proto__ ist umstritten und wird nicht empfohlen. Seine Existenz und sein genaues Verhalten wurden nur als Legacy-Feature standardisiert, um die Web-Kompatibilität sicherzustellen, während es mehrere Sicherheitsprobleme darstellt. Für bessere Unterstützung sollten Sie stattdessen Object.getPrototypeOf()/Reflect.getPrototypeOf() und Object.setPrototypeOf()/Reflect.setPrototypeOf() verwenden.

Die __proto__ Accessor-Eigenschaft von Object Instanzen zeigt das [[Prototype]] (entweder ein Objekt oder null) dieses Objekts an.

Die __proto__-Eigenschaft kann auch in einer Objektliteral-Definition verwendet werden, um das Objekt [[Prototype]] bei der Erstellung festzulegen, als Alternative zu Object.create(). Siehe: Objektinitialisierer / Literalsyntax. Diese Syntax ist standardisiert und in Implementierungen optimiert und unterscheidet sich stark von Object.prototype.__proto__.

Syntax

js
obj.__proto__

Rückgabewert

Bei Verwendung als Getter gibt es das [[Prototype]] des Objekts zurück.

Ausnahmen

TypeError

Wird ausgelöst, wenn versucht wird, das Prototyp eines nicht-veränderbaren Objekts oder eines unveränderbaren exotischen Prototypobjekts festzulegen, wie Object.prototype oder window.

Beschreibung

Die __proto__-Getterfunktion zeigt den Wert des internen [[Prototype]] eines Objekts an. Für Objekte, die mit einem Objektliteral erstellt wurden (es sei denn, Sie verwenden die Prototype-Setter Syntax), ist dieser Wert Object.prototype. Für mit Array-Literals erstellte Objekte ist dieser Wert Array.prototype. Für Funktionen ist dieser Wert Function.prototype. Weitere Informationen zur Prototyp-Kette finden Sie unter Vererbung und die Prototyp-Kette.

Der __proto__-Setter erlaubt es, das [[Prototype]] eines Objekts zu ändern. Der bereitgestellte Wert muss ein Objekt oder null sein. Andere Werte haben keine Wirkung.

Im Gegensatz zu Object.getPrototypeOf() und Object.setPrototypeOf(), die immer als statische Eigenschaften auf Object verfügbar sind und immer das interne [[Prototype]] anzeigen, existiert die __proto__-Eigenschaft nicht immer als Eigenschaft auf allen Objekten und zeigt daher [[Prototype]] nicht zuverlässig an.

Die __proto__-Eigenschaft ist eine einfache Accessor-Eigenschaft auf Object.prototype, die aus einer Getter- und Setter-Funktion besteht. Ein Eigenschaftszugriff für __proto__, der schließlich Object.prototype konsultiert, wird diese Eigenschaft finden, aber ein Zugriff, der Object.prototype nicht konsultiert, wird dies nicht tun. Wenn eine andere __proto__-Eigenschaft gefunden wird, bevor Object.prototype konsultiert wird, wird diese die auf Object.prototype gefundene Eigenschaft verbergen.

Null-Prototyp-Objekte erben keine Eigenschaft von Object.prototype, einschließlich der __proto__-Accessor-Eigenschaft, daher ist der Wert immer undefined, wenn Sie __proto__ auf einem solchen Objekt lesen, unabhängig davon, welches tatsächliche [[Prototype]] das Objekt hat, und jede Zuweisung an __proto__ würde eine neue Eigenschaft namens __proto__ erstellen, anstatt das Prototyp des Objekts festzulegen. Außerdem kann __proto__ durch Object.defineProperty() als eigene Eigenschaft auf jeder Objektinstanz neu definiert werden, ohne den Setter auszulösen. In diesem Fall ist __proto__ kein Accessor für [[Prototype]]. Daher sollten Sie immer Object.getPrototypeOf() und Object.setPrototypeOf() bevorzugen, um das [[Prototype]] eines Objekts festzulegen und abzurufen.

Beispiele

Verwendung von __proto__

js
function Circle() {}
const shape = {};
const circle = new Circle();

// Set the object prototype.
// DEPRECATED. This is for example purposes only. DO NOT DO THIS in real code.
shape.__proto__ = circle;

// Get the object prototype
console.log(shape.__proto__ === Circle); // false
js
const ShapeA = function () {};
const ShapeB = {
  a() {
    console.log("aaa");
  },
};

ShapeA.prototype.__proto__ = ShapeB;
console.log(ShapeA.prototype.__proto__); // { a: [Function: a] }

const shapeA = new ShapeA();
shapeA.a(); // aaa
console.log(ShapeA.prototype === shapeA.__proto__); // true
js
const ShapeC = function () {};
const ShapeD = {
  a() {
    console.log("a");
  },
};

const shapeC = new ShapeC();
shapeC.__proto__ = ShapeD;
shapeC.a(); // a
console.log(ShapeC.prototype === shapeC.__proto__); // false
js
function Test() {}
Test.prototype.myName = function () {
  console.log("myName");
};

const test = new Test();
console.log(test.__proto__ === Test.prototype); // true
test.myName(); // myName

const obj = {};
obj.__proto__ = Test.prototype;
obj.myName(); // myName

Spezifikationen

Specification
ECMAScript Language Specification
# sec-object.prototype.__proto__

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch