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 Art und Weise, wie moderne JavaScript-Engines den Zugriff auf Eigenschaften optimieren, derzeit in jedem Browser und jeder JavaScript-Engine eine sehr langsame Operation. Außerdem sind die Auswirkungen der Änderung der Vererbung subtil und weitreichend und beschränken sich nicht nur auf die Zeit, die im obj.__proto__ = ...
-Statement verbracht wird, sondern können sich auf jede Funktion erstrecken, die auf ein Objekt zugreift, dessen [[Prototype]]
verä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 das genaue Verhalten wurden nur als veraltetes Feature standardisiert, um die Web-Kompatibilität zu gewährleisten, während es mehrere Sicherheitsprobleme und Stolperfallen mit sich bringt. Für besseren Support sollten Sie stattdessen Object.getPrototypeOf()
/Reflect.getPrototypeOf()
und Object.setPrototypeOf()
/Reflect.setPrototypeOf()
verwenden.
Die __proto__
Accessor-Eigenschaft von Object
-Instanzen gibt das [[Prototype]]
(entweder ein Objekt oder null
) dieses Objekts frei.
Die __proto__
-Eigenschaft kann auch in einer Objekt-Literal-Definition verwendet werden, um das Objekt-[[Prototype]]
bei der Erstellung festzulegen, als Alternative zu Object.create()
. Siehe: Objekt-Initialisierer / Literal-Syntax. Diese Syntax ist standardisiert und optimiert in Implementierungen und unterscheidet sich erheblich von Object.prototype.__proto__
.
Syntax
obj.__proto__
Rückgabewert
Wenn als Getter verwendet, gibt das [[Prototype]]
des Objekts zurück.
Ausnahmen
TypeError
-
Wird ausgelöst, wenn versucht wird, das Prototyp eines nicht erweiterbaren Objekts oder eines unveränderlichen exotischen Prototyps festzulegen, wie
Object.prototype
oderwindow
.
Beschreibung
Die __proto__
Getter-Funktion gibt den Wert des internen [[Prototype]]
eines Objekts frei. Für Objekte, die mit einem Objekt-Literal erstellt wurden (sofern Sie nicht die Prototype-Setter-Syntax verwenden), ist dieser Wert Object.prototype
. Für Objekte, die mit Array-Literalen erstellt worden sind, ist dieser Wert Array.prototype
. Für Funktionen ist dieser Wert Function.prototype
. Weitere Informationen zur Prototyp-Kette finden Sie in Inheritance and the prototype chain.
Der __proto__
-Setter erlaubt es, das [[Prototype]]
eines Objekts zu ändern. Der gegebene Wert muss ein Objekt oder null
sein. Jeder andere Wert wird nichts bewirken.
Im Gegensatz zu Object.getPrototypeOf()
und Object.setPrototypeOf()
, die immer als statische Eigenschaften auf Object
verfügbar sind und immer die interne [[Prototype]]
-Eigenschaft widerspiegeln, existiert die __proto__
-Eigenschaft nicht immer als Eigenschaft auf allen Objekten und reflektiert daher [[Prototype]]
nicht zuverlässig.
Die __proto__
-Eigenschaft ist nur eine Accessor-Eigenschaft auf Object.prototype
, bestehend aus einer Getter- und Setter-Funktion. Ein Eigenschaftszugriff auf __proto__
, der letztendlich Object.prototype
abfragt, wird diese Eigenschaft finden, aber ein Zugriff, der Object.prototype
nicht abfragt, wird es nicht tun. Wenn eine andere __proto__
-Eigenschaft gefunden wird, bevor Object.prototype
abgefragt 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. Deshalb wird der Wert, wenn Sie __proto__
auf solch einem Objekt lesen, immer undefined
sein, unabhängig vom tatsächlichen [[Prototype]]
des Objekts, und jede Zuordnung zu __proto__
würde eine neue Eigenschaft namens __proto__
erstellen, anstatt das Prototyp des Objekts festzulegen. Darüber hinaus kann __proto__
als eigene Eigenschaft auf jeder Objektinstanz durch Object.defineProperty()
neu definiert werden, ohne den Setter auszulösen. In diesem Fall wird __proto__
nicht länger ein Accessor für [[Prototype]]
sein. Daher sollten Sie immer Object.getPrototypeOf()
und Object.setPrototypeOf()
bevorzugen, um das [[Prototype]]
eines Objekts festzulegen und abzurufen.
Beispiele
Verwendung von __proto__
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
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
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
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