Object.hasOwn()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit März 2022 browserübergreifend verfügbar.
Die statische Methode Object.hasOwn() gibt true zurück, wenn das angegebene Objekt die betreffende Eigenschaft als eigene Eigenschaft besitzt. Wenn die Eigenschaft geerbt wurde oder nicht existiert, gibt die Methode false zurück.
Hinweis:
Object.hasOwn() ist als Ersatz für Object.prototype.hasOwnProperty() vorgesehen.
Probieren Sie es aus
const object = {
prop: "exists",
};
console.log(Object.hasOwn(object, "prop"));
// Expected output: true
console.log(Object.hasOwn(object, "toString"));
// Expected output: false
console.log(Object.hasOwn(object, "undeclaredPropertyValue"));
// Expected output: false
Syntax
Object.hasOwn(obj, prop)
Parameter
Rückgabewert
true, wenn die angegebene Eigenschaft direkt auf dem angegebenen Objekt definiert ist. Andernfalls false.
Beschreibung
Die Methode Object.hasOwn() gibt true zurück, wenn die angegebene Eigenschaft eine direkte Eigenschaft des Objekts ist – auch wenn ihr Wert null oder undefined ist. Die Methode gibt false zurück, wenn die Eigenschaft geerbt wurde oder überhaupt nicht deklariert ist. Anders als der Operator in prüft diese Methode nicht, ob die angegebene Eigenschaft in der Prototypkette des Objekts vorhanden ist.
Sie wird gegenüber Object.prototype.hasOwnProperty() empfohlen, weil sie mit Objekten mit null-Prototyp und mit Objekten funktioniert, die die geerbte Methode hasOwnProperty() überschrieben haben. Diese Probleme lassen sich zwar umgehen, indem Object.prototype.hasOwnProperty() über ein anderes Objekt aufgerufen wird (etwa mit Object.prototype.hasOwnProperty.call(obj, prop)), aber Object.hasOwn() ist intuitiver und kürzer.
Beispiele
>Mit Object.hasOwn() prüfen, ob eine Eigenschaft existiert
Der folgende Code zeigt, wie Sie feststellen können, ob das Objekt example eine Eigenschaft namens prop enthält.
const example = {};
Object.hasOwn(example, "prop"); // false - 'prop' has not been defined
example.prop = "exists";
Object.hasOwn(example, "prop"); // true - 'prop' has been defined
example.prop = null;
Object.hasOwn(example, "prop"); // true - own property exists with value of null
example.prop = undefined;
Object.hasOwn(example, "prop"); // true - own property exists with value of undefined
Direkte und geerbte Eigenschaften
Das folgende Beispiel unterscheidet zwischen direkten Eigenschaften und Eigenschaften, die über die Prototypkette geerbt wurden:
const example = {};
example.prop = "exists";
// `hasOwn` will only return true for direct properties:
Object.hasOwn(example, "prop"); // true
Object.hasOwn(example, "toString"); // false
Object.hasOwn(example, "hasOwnProperty"); // false
// The `in` operator will return true for direct or inherited properties:
"prop" in example; // true
"toString" in example; // true
"hasOwnProperty" in example; // true
Über die Eigenschaften eines Objekts iterieren
Um über die aufzählbaren Eigenschaften eines Objekts zu iterieren, sollten Sie Folgendes verwenden:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
// …
}
Wenn Sie jedoch for...in verwenden müssen, können Sie mit Object.hasOwn() die geerbten Eigenschaften überspringen:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
// …
}
}
Prüfen, ob ein Array-Index existiert
Die Elemente eines Array sind als direkte Eigenschaften definiert. Daher können Sie mit der Methode hasOwn() prüfen, ob ein bestimmter Index existiert:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false - not defined
Problemfälle für hasOwnProperty()
Dieser Abschnitt zeigt, dass Object.hasOwn() nicht von den Problemen betroffen ist, die bei hasOwnProperty() auftreten. Erstens kann die Methode mit Objekten verwendet werden, die hasOwnProperty() neu implementiert haben. Im folgenden Beispiel meldet die neu implementierte Methode hasOwnProperty() für jede Eigenschaft false, das Verhalten von Object.hasOwn() bleibt jedoch unverändert:
const foo = {
hasOwnProperty() {
return false;
},
bar: "The dragons be out of office",
};
console.log(foo.hasOwnProperty("bar")); // false
console.log(Object.hasOwn(foo, "bar")); // true
Die Methode kann auch mit Objekten mit null-Prototyp verwendet werden. Diese erben nicht von Object.prototype, weshalb hasOwnProperty() nicht verfügbar ist.
const foo = Object.create(null);
foo.prop = "exists";
console.log(foo.hasOwnProperty("prop"));
// Uncaught TypeError: foo.hasOwnProperty is not a function
console.log(Object.hasOwn(foo, "prop")); // true
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.hasown> |