| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/proto | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Avoid using this feature in new projects.
Changing __proto__ is slow and can cause surprising bugs.
This feature may be a candidate for removal from web standards or browsers.
Warnung:
Das ndern des [[Prototype]] eines Objekts ist, aufgrund der Art und Weise, wie moderne JavaScript-Engines den Zugriff auf Eigenschaften optimieren, derzeit eine sehr langsame Operation in jedem Browser und jeder JavaScript-Engine. Darber hinaus sind die Auswirkungen der Vernderung der Vererbung subtil und weitreichend und beschrnken sich nicht auf die Zeit, die mit der Anweisung obj.__proto__ = ... verbracht wird, sondern knnen sich auf beliebigen Code auswirken, der Zugriff auf ein beliebiges Objekt hat, dessen [[Prototype]] verndert wurde. Mehr dazu erfahren Sie in JavaScript engine fundamentals: optimizing prototypes.
Hinweis:
Die Verwendung von __proto__ ist umstritten und wird nicht empfohlen. Ihre Existenz und ihr genaues Verhalten wurden nur als Legacy-Feature standardisiert, um die Web-Kompatibilitt zu gewhrleisten, whrend sie mehrere Sicherheitsprobleme und Stolperfallen darstellt. Fr eine bessere Untersttzung sollten Sie stattdessen Object.getPrototypeOf()/Reflect.getPrototypeOf() und Object.setPrototypeOf()/Reflect.setPrototypeOf() bevorzugen.
Die __proto__ Accessor-Eigenschaft von Object-Instanzen legt das [[Prototype]] (entweder ein Objekt oder null) dieses Objekts offen.
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: object initializer / literal syntax. Diese Syntax ist standardisiert und in Implementierungen optimiert und unterscheidet sich deutlich von Object.prototype.__proto__.
obj.__proto__
Wenn als Getter verwendet, gibt es das [[Prototype]] des Objekts zurck.
TypeErrorWird ausgelst, wenn versucht wird, das Prototype eines nicht-erweiterbaren Objekts oder eines unvernderbaren Prototype Exotenobjekts wie Object.prototype oder window festzulegen.
Die __proto__-Getterfunktion legt den Wert des internen [[Prototype]] eines Objekts offen. Fr Objekte, die mit einem Objektliteral erstellt wurden (es sei denn, Sie verwenden die Prototype Setter Syntax), ist dieser Wert Object.prototype. Fr Objekte, die mit Array-Literalen erstellt wurden, ist dieser Wert Array.prototype. Fr Funktionen ist dieser Wert Function.prototype. Mehr ber die Prototype-Kette erfahren Sie in Vererbung und die Prototype-Kette.
Der __proto__-Setter ermglicht es, das [[Prototype]] eines Objekts zu ndern. Der bereitgestellte Wert muss ein Objekt oder null sein. Die Bereitstellung eines anderen Wertes hat keine Wirkung.
Anders als Object.getPrototypeOf() und Object.setPrototypeOf(), die immer als statische Eigenschaften auf Object verfgbar sind und stets die interne [[Prototype]]-Eigenschaft widerspiegeln, existiert die __proto__-Eigenschaft nicht immer als Eigenschaft auf allen Objekten und spiegelt daher [[Prototype]] nicht zuverlssig wider.
Die __proto__-Eigenschaft ist lediglich eine Accessor-Eigenschaft auf Object.prototype, die aus einer Getter- und einer Setter-Funktion besteht. Ein Eigenschaftszugriff auf __proto__, der schlielich Object.prototype konsultiert, wird diese Eigenschaft finden, aber ein Zugriff, der Object.prototype nicht konsultiert, wird es nicht. Wenn eine andere __proto__-Eigenschaft gefunden wird, bevor Object.prototype konsultiert wird, wird diese Eigenschaft die auf Object.prototype gefundene Eigenschaft verbergen.
null-Prototype-Objekte erben keine Eigenschaft von Object.prototype, einschlielich der __proto__-Accessor-Eigenschaft, sodass bei einem Leseversuch von __proto__ bei einem solchen Objekt der Wert immer undefined ist, unabhngig vom tatschlichen [[Prototype]] des Objekts, und jede Zuweisung an __proto__ wrde eine neue Eigenschaft namens __proto__ erzeugen, anstatt das Prototype des Objekts festzulegen. Darber hinaus kann __proto__ als eine eigene Eigenschaft auf jeder Objektinstanz durch Object.defineProperty() umdefiniert werden, ohne den Setter auszulsen. In diesem Fall ist __proto__ kein Accessor mehr fr [[Prototype]]. Daher sollten Sie immer Object.getPrototypeOf() und Object.setPrototypeOf() zum Setzen und Abrufen des [[Prototype]] eines Objekts bevorzugen.
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
function ShapeA() {}
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
function ShapeC() {}
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
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-object.prototype.__proto__ |
Object.prototype.isPrototypeOf()Object.getPrototypeOf()Object.setPrototypeOf()Objectassign()create()defineProperties()defineProperty()entries()freeze()fromEntries()getOwnPropertyDescriptor()getOwnPropertyDescriptors()getOwnPropertyNames()getOwnPropertySymbols()getPrototypeOf()groupBy()hasOwn()is()isExtensible()isFrozen()isSealed()keys()preventExtensions()seal()setPrototypeOf()values()Object/FunctionDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |