| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Juli 2015 browserbergreifend verfgbar.
* Einige Teile dieser Funktion werden mglicherweise unterschiedlich gut untersttzt.
Der Object-Typ reprsentiert einen der JavaScripts Datentypen. Er wird verwendet, um verschiedene schlsselbasierte Sammlungen und komplexere Entitten zu speichern. Objekte knnen entweder mit dem Object()-Konstruktor oder der Objektinitialisierer-/Literal-Syntax erstellt werden.
Fast alle Objekte in JavaScript sind Instanzen von Object; ein typisches Objekt erbt Eigenschaften (einschlielich Methoden) von Object.prototype, auch wenn diese Eigenschaften berschattet (d.h. berschrieben) werden knnen. Die einzigen Objekte, die nicht von Object.prototype erben, sind Objekte mit null-Prototyp oder solche, die von anderen null-Prototypobjekten abgeleitet sind.
nderungen am Object.prototype-Objekt sind durch die Prototypkette fr alle Objekte sichtbar, es sei denn, die Eigenschaften und Methoden, die diesen nderungen unterliegen, werden weiter unten in der Prototypkette berschrieben. Dies bietet eine sehr mchtige, jedoch potenziell gefhrliche Mechanismus, um das Verhalten von Objekten zu berschreiben oder zu erweitern. Um es sicherer zu machen, ist Object.prototype das einzige Objekt in der Kern-JavaScript-Sprache, das einen unvernderlichen Prototyp hat der Prototyp von Object.prototype ist immer null und nicht nderbar.
Sie sollten es vermeiden, Methoden von Object.prototype direkt von der Instanz aus aufzurufen, insbesondere jene, die nicht polymorph sein sollen (d.h. bei denen nur das ursprngliche Verhalten sinnvoll ist und kein abgeleitetes Objekt es sinnvoll berschreiben knnte). Alle von Object.prototype abstammenden Objekte knnen eine eigene benutzerdefinierte Eigenschaft mit demselben Namen definieren, die jedoch vllig andere Semantiken bietet, als Sie erwarten. Auerdem werden diese Eigenschaften nicht von null-Prototypobjekten geerbt. Alle modernen JavaScript-Dienstprogramme fr die Arbeit mit Objekten sind statisch. Konkret:
valueOf(), toString() und toLocaleString() existieren, um polymorph zu sein, und Sie sollten erwarten, dass das Objekt seine eigene Implementierung mit sinnvollen Verhaltensweisen definiert, sodass Sie sie als Instanzmethoden aufrufen knnen. valueOf() und toString() werden in der Regel jedoch implizit durch Typkonvertierung aufgerufen, und Sie mssen sie nicht selbst in Ihrem Code aufrufen.__defineGetter__(), __defineSetter__(), __lookupGetter__() und __lookupSetter__() sind veraltet und sollten nicht mehr verwendet werden. Verwenden Sie stattdessen die statischen Alternativen Object.defineProperty() und Object.getOwnPropertyDescriptor().__proto__-Eigenschaft ist veraltet und sollte nicht verwendet werden. Die Alternativen Object.getPrototypeOf() und Object.setPrototypeOf() sind statische Methoden.propertyIsEnumerable() und hasOwnProperty() knnen mit den statischen Methoden Object.getOwnPropertyDescriptor() und Object.hasOwn() ersetzt werden.isPrototypeOf() kann normalerweise mit instanceof ersetzt werden, wenn Sie die prototype-Eigenschaft eines Konstruktors berprfen.Falls es keine semantisch quivalente statische Methode gibt oder wenn Sie wirklich die Object.prototype-Methode verwenden mchten, sollten Sie die Object.prototype-Methode direkt mit call() auf Ihrem Zielobjekt aufrufen, um zu verhindern, dass das Objekt eine berschreibende Eigenschaft hat, die unerwartete Ergebnisse liefert.
const obj = {
foo: 1,
// You should not define such a method on your own object,
// but you may not be able to prevent it from happening if
// you are receiving the object from external input
propertyIsEnumerable() {
return false;
},
};
obj.propertyIsEnumerable("foo"); // false; unexpected result
Object.prototype.propertyIsEnumerable.call(obj, "foo"); // true; expected result
Es gibt keine Methode in einem Objekt selbst, um seine eigenen Eigenschaften zu lschen (wie z. B. Map.prototype.delete()). Um dies zu tun, muss man den delete-Operator verwenden.
Fast alle Objekte in JavaScript erben letztlich von Object.prototype (siehe Vererbung und die Prototypkette). Sie knnen jedoch null-Prototypobjekte mit Object.create(null) oder der Objektinitialisierer-Syntax mit __proto__: null erstellen (beachten Sie: Der Schlssel __proto__ in Objektliteralen unterscheidet sich von der veralteten Object.prototype.__proto__-Eigenschaft). Sie knnen auch den Prototyp eines bestehenden Objekts auf null setzen, indem Sie Object.setPrototypeOf(obj, null) aufrufen.
const obj = Object.create(null);
const obj2 = { __proto__: null };
Ein Objekt mit einem null-Prototyp kann sich auf unerwartete Weise verhalten, da es keine Objektmethoden von Object.prototype erbt. Dies gilt insbesondere beim Debuggen, da gngige Werkzeuge zur Objekt-Eigenschaftskonvertierung/-erkennung Fehler erzeugen oder Informationen verlieren knnen (besonders wenn stille Fehlerschutzmanahmen verwendet werden, die Fehler ignorieren).
Zum Beispiel macht das Fehlen von Object.prototype.toString() das Debuggen oft unlsbar:
const normalObj = {}; // create a normal object
const nullProtoObj = Object.create(null); // create an object with "null" prototype
console.log(`normalObj is: ${normalObj}`); // shows "normalObj is: [object Object]"
console.log(`nullProtoObj is: ${nullProtoObj}`); // throws error: Cannot convert object to primitive value
alert(normalObj); // shows [object Object]
alert(nullProtoObj); // throws error: Cannot convert object to primitive value
Andere Methoden werden ebenfalls scheitern.
normalObj.valueOf(); // shows {}
nullProtoObj.valueOf(); // throws error: nullProtoObj.valueOf is not a function
normalObj.hasOwnProperty("p"); // shows "true"
nullProtoObj.hasOwnProperty("p"); // throws error: nullProtoObj.hasOwnProperty is not a function
normalObj.constructor; // shows "Object() { [native code] }"
nullProtoObj.constructor; // shows "undefined"
Wir knnen die toString-Methode zurck zu dem Null-Prototypobjekt hinzufgen, indem wir ihm eine zuweisen:
nullProtoObj.toString = Object.prototype.toString; // since new object lacks toString, add the original generic one back
console.log(nullProtoObj.toString()); // shows "[object Object]"
console.log(`nullProtoObj is: ${nullProtoObj}`); // shows "nullProtoObj is: [object Object]"
Im Gegensatz zu normalen Objekten, bei denen toString() im Prototyp des Objekts ist, ist die toString()-Methode hier eine eigene Eigenschaft von nullProtoObj. Das liegt daran, dass nullProtoObj keinen (null) Prototyp hat.
Sie knnen auch ein Null-Prototypobjekt zurck in ein gewhnliches Objekt umwandeln, indem Sie Object.setPrototypeOf(nullProtoObj, Object.prototype) aufrufen.
In der Praxis werden Objekte mit null-Prototyp oft als gnstiger Ersatz fr Maps verwendet. Die Anwesenheit von Object.prototype-Eigenschaften kann einige Fehler verursachen:
const ages = { alice: 18, bob: 27 };
function hasPerson(name) {
return name in ages;
}
function getAge(name) {
return ages[name];
}
hasPerson("hasOwnProperty"); // true
getAge("toString"); // [Function: toString]
Das Verwenden eines Null-Prototypobjekts beseitigt diese Gefahr, ohne zu viel Komplexitt in die hasPerson- und getAge-Funktionen einzufhren:
const ages = Object.create(null, {
alice: { value: 18, enumerable: true },
bob: { value: 27, enumerable: true },
});
hasPerson("hasOwnProperty"); // false
getAge("toString"); // undefined
In einem solchen Fall sollte das Hinzufgen von Methoden vorsichtig erfolgen, da sie mit den anderen als Daten gespeicherten Schlssel-Werte-Paaren verwechselt werden knnen.
Wenn Ihr Objekt nicht von Object.prototype erbt, verhindert es auch Prototype Pollution-Angriffe. Wenn ein bsartiges Skript eine Eigenschaft zu Object.prototype hinzufgt, wird sie auf jedem Objekt in Ihrem Programm zugnglich sein, auer auf Objekten, die einen Null-Prototyp haben.
const user = {};
// A malicious script:
Object.prototype.authenticated = true;
// Unexpectedly allowing unauthenticated user to pass through
if (user.authenticated) {
// access confidential data
}
JavaScript hat auch eingebaute APIs, die null-Prototypobjekte erzeugen, insbesondere solche, die Objekte als Ad-hoc-Schlssel-Wert-Sammlungen verwenden. Zum Beispiel:
Object.groupBy()groups- und indices.groups-Eigenschaften des Ergebnisses von RegExp.prototype.exec()Array.prototype[Symbol.unscopables] (alle [Symbol.unscopables]-Objekte sollten einen Null-Prototyp haben)import.metaimport * as ns from "module"; oder import() erhalten werdenDer Begriff "null-Prototypobjekt" schliet oft auch alle Objekte ohne Object.prototype in ihrer Prototypkette ein. Solche Objekte knnen mit extends null erstellt werden, wenn Klassen verwendet werden.
Viele eingebaute Operationen, die Objekte erwarten, erzwingen zuerst, dass ihre Argumente zu Objekten umgewandelt werden. Der Vorgang kann wie folgt zusammengefasst werden:
undefined und null werfen ein TypeError.Number, String, Boolean, Symbol, BigInt Primitive werden in ihre entsprechenden Objektumhllungen gewickelt.Es gibt zwei Mglichkeiten, fast denselben Effekt in JavaScript zu erzielen.
Object.prototype.valueOf(): Object.prototype.valueOf.call(x) fhrt genau die oben erklrten Objektkoerzierungsschritte aus, um x zu konvertieren.Object()-Funktion: Object(x) verwendet denselben Algorithmus, um x zu konvertieren, mit der Ausnahme, dass undefined und null keinen TypeError werfen, sondern ein einfaches Objekt zurckgeben.Pltze, die Objektkoerzierung verwenden, sind:
object-Parameter von for...in Schleifen.this-Wert von Array-Methoden.Object-Methoden wie Object.keys().this-Wert beim Aufrufen einer nicht-strikten Funktion. Primitive werden in einer Box verpackt, whrend null und undefined durch das Globale Objekt ersetzt werden.Im Gegensatz zur Konvertierung zu Primitive ist der Koerzierungsvorgang selbst in keiner Weise beobachtbar, da er keinen benutzerdefinierten Code wie toString- oder valueOf-Methoden aufruft.
Object()Konvertiert die Eingabe in ein Objekt.
Object.assign()Kopiert die Werte aller eigenen aufzhlbaren Eigenschaften von einem oder mehreren Quellobjekten auf ein Zielobjekt.
Object.create()Erstellt ein neues Objekt mit dem angegebenen Prototyp-Objekt und Eigenschaften.
Object.defineProperties()Fgt die in den gegebenen Deskriptoren beschriebenen benannten Eigenschaften zu einem Objekt hinzu.
Object.defineProperty()Fgt die in einem gegebenen Deskriptor beschriebene benannte Eigenschaft zu einem Objekt hinzu.
Object.entries()Gibt ein Array zurck, das alle [Key, Value]-Paare der eigenen aufzhlbaren String-Eigenschaften eines gegebenen Objekts enthlt.
Object.freeze()Friert ein Objekt ein. Anderer Code kann seine Eigenschaften nicht lschen oder ndern.
Object.fromEntries()Gibt ein neues Objekt aus einem iterierbaren Objekt von [Key, Value]-Paaren zurck. (Dies ist das Gegenteil von Object.entries).
Object.getOwnPropertyDescriptor()Gibt einen Eigenschaftsdeskriptor fr eine benannte Eigenschaft eines Objekts zurck.
Object.getOwnPropertyDescriptors()Gibt ein Objekt zurck, das alle eigenen Eigenschaftsdeskriptoren fr ein Objekt enthlt.
Object.getOwnPropertyNames()Gibt ein Array zurck, das die Namen aller eigenen aufzhlbaren und nicht aufzhlbaren Eigenschaften des gegebenen Objekts enthlt.
Object.getOwnPropertySymbols()Gibt ein Array aller unmittelbar auf einem gegebenen Objekt gefundenen Symbol-Eigenschaften zurck.
Object.getPrototypeOf()Gibt den Prototyp (interne [[Prototyp]]-Eigenschaft) des angegebenen Objekts zurck.
Object.groupBy()Gruppiert die Elemente eines gegebenen iterierbaren Objekts nach den von einer bereitgestellten Rckruffunktion zurckgegebenen String-Werten. Das zurckgegebene Objekt hat separate Eigenschaften fr jede Gruppe, die Arrays mit den Elementen in der Gruppe enthalten.
Object.hasOwn()Gibt true zurck, wenn das angegebene Objekt die angegebene Eigenschaft als eigene Eigenschaft besitzt, oder false, wenn die Eigenschaft geerbt ist oder nicht existiert.
Object.is()Vergleicht, ob zwei Werte derselbe Wert sind. Sammelt alle NaN-Werte (was sich sowohl vom IsLooselyEqual beim == als auch vom IsStrictlyEqual beim === unterscheidet).
Object.isExtensible()Bestimmt, ob eine Erweiterung eines Objekts zugelassen ist.
Object.isFrozen()Bestimmt, ob ein Objekt eingefroren wurde.
Object.isSealed()Bestimmt, ob ein Objekt versiegelt ist.
Object.keys()Gibt ein Array zurck, das die Namen aller eigenen aufzhlbaren String-Eigenschaften des gegebenen Objekts enthlt.
Object.preventExtensions()Verhindert alle Erweiterungen eines Objekts.
Object.seal()Verhindert, dass anderer Code Eigenschaften eines Objekts lscht.
Object.setPrototypeOf()Setzt den Prototyp des Objekts (seine interne [[Prototype]]-Eigenschaft).
Object.values()Gibt ein Array zurck, das die Werte enthlt, die den eigenen aufzhlbaren String-Eigenschaften eines gegebenen Objekts entsprechen.
Diese Eigenschaften sind auf Object.prototype definiert und werden von allen Object-Instanzen geteilt.
Object.prototype.__proto__ Verweist auf das Objekt, das als Prototyp verwendet wurde, als das Objekt instanziiert wurde.
Object.prototype.constructorDie Konstruktorfunktion, die das Instanzobjekt erzeugte. Fr einfache Object-Instanzen ist der Anfangswert der Object-Konstruktor. Instanzen anderer Konstruktoren erben jeweils die constructor-Eigenschaft von ihrem jeweiligen Constructor.prototype-Objekt.
Object.prototype.__defineGetter__() Verknpft eine Funktion mit einer Eigenschaft, die beim Zugriff auf die Funktion ausgefhrt wird und ihren Rckgabewert zurckgibt.
Object.prototype.__defineSetter__() Verknpft eine Funktion mit einer Eigenschaft, die beim Setzen ausgefhrt wird und die Eigenschaft verndert.
Object.prototype.__lookupGetter__() Gibt die als Getter an die angegebene Eigenschaft gebundene Funktion zurck.
Object.prototype.__lookupSetter__() Gibt die als Setter an die angegebene Eigenschaft gebundene Funktion zurck.
Object.prototype.hasOwnProperty()Gibt einen booleschen Wert zurck, der angibt, ob ein Objekt die angegebene Eigenschaft als direkte Eigenschaft dieses Objekts und nicht durch die Prototypkette vererbt enthlt.
Object.prototype.isPrototypeOf()Gibt einen booleschen Wert zurck, der angibt, ob das Objekt, auf das diese Methode aufgerufen wird, in der Prototypkette des angegebenen Objekts ist.
Object.prototype.propertyIsEnumerable()Gibt einen booleschen Wert zurck, der angibt, ob die angegebene Eigenschaft die aufzhlbare eigene Eigenschaft des Objekts ist.
Object.prototype.toLocaleString()Ruft toString() auf.
Object.prototype.toString()Gibt eine String-Darstellung des Objekts zurck.
Object.prototype.valueOf()Gibt den primitiven Wert des angegebenen Objekts zurck.
Das folgende Beispiel erstellt leere Objekte mithilfe des new-Schlsselworts mit unterschiedlichen Argumenten:
const o1 = new Object();
const o2 = new Object(undefined);
const o3 = new Object(null);
Sie knnen den Object()-Konstruktor verwenden, um ein Objekt-Wrapper eines primitiven Werts zu erstellen.
Die folgenden Beispiele erstellen die Variablen o1 und o2, welche Objekte sind, die Boolean und BigInt Werte speichern:
// Equivalent to const o1 = new Boolean(true)
const o1 = new Object(true);
// No equivalent because BigInt() can't be called as a constructor,
// and calling it as a regular function won't create an object
const o2 = new Object(1n);
Wenn Sie das Verhalten vorhandener Object.prototype-Methoden ndern, ziehen Sie in Betracht, Code einzufgen, indem Sie Ihre Erweiterung vor oder nach der vorhandenen Logik einwickeln. Zum Beispiel wird dieser (nicht getestete) Code benutzerdefinierte Logik vor der eingebauten Logik oder der Erweiterung eines anderen bedingt ausfhren.
Wenn Sie Prototypen mit Hooks modifizieren, bergeben Sie this und die Argumente (den Aufrufzustand) an das aktuelle Verhalten, indem Sie apply() auf die Funktion aufrufen. Dieses Muster kann fr jeden Prototyp verwendet werden, wie Node.prototype, Function.prototype usw.
const current = Object.prototype.valueOf;
// Since my property "-prop-value" is cross-cutting and isn't always
// on the same prototype chain, I want to modify Object.prototype:
Object.prototype.valueOf = function (...args) {
if (Object.hasOwn(this, "-prop-value")) {
return this["-prop-value"];
}
// It doesn't look like one of my objects, so let's fall back on
// the default behavior by reproducing the current behavior as best we can.
// The apply behaves like "super" in some other languages.
// Even though valueOf() doesn't take arguments, some other hook may.
return current.apply(this, args);
};
Warnung:
Das ndern der prototype-Eigenschaft eines eingebauten Konstruktors wird als schlechte Praxis angesehen und birgt Risiken der zuknftigen Kompatibilitt.
Sie knnen mehr ber Prototypen in Vererbung und die Prototypkette lesen.
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-object-objects |
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 |