JavaScript/Objekte/Object/hasOwnProperty
Mittels der von Object.prototype vererbten Methode hasOwnProperty kann überprüft werden, ob ein Objekt eine eigene Eigenschaft mit einem bestimmten Schlüssel hat, also eine Eigenschaft, die nicht über die Prototypenkette geerbt wurde.
Syntax
Object.prototype.hasOwnProperty(name)
Writable | true |
Enumerable | false |
Configurable | true |
Prototyp
Eigenschaften
Inhaltsverzeichnis
Beschreibung
Die Methode erwartet als Parameter den Schlüssel der gesuchten Eigenschaft und gibt einen booleschen Wert zurück, also true oder false, je nach dem ob bei dem Objekt auf dem die Methode aufgerufen wurde eine eigene Eigenschaft mit dem angegebenen Schlüssel gefunden wurde oder nicht.
const earth = {
color : 'blue',
radius : 6371
};
console.log(earth.hasOwnProperty('color')); // true
Im obigen Beispiel wird zunächst in Literalschreibweise ein neues Objekt mit zwei Eigenschaften erstellt und der Konstante mit dem Bezeichner earth als Wert zugewiesen. Wird ein Objekt auf diese Weise erzeugt, dann ist der Wert seiner internen Eigenschaft [[Prototype]] immer eine Referenz auf Object.prototype, sodass unter anderem die Methode hasOwnProperty geerbt wird. Diese wird hier nun auf dem Objekt ausgeführt, wobei der Eigenschaftsname color als Argument übergeben wird. Da das untersuchte Objekt eine eigene Eigenschaft dieses Namens besitzt, wird hier entsprechend der Rückgabewert true in die Konsole geschrieben.
const mars = {
color : 'red',
radius : 3390
};
console.log(mars.hasOwnProperty('valueOf')); // false
In diesem Beispiel wird die Methode auf dem Objekt mit dem Namen mars mit der Zeichenkette valueOf als Argument aufgerufen, was zur Folge hat, dass der Rückgabewert false in die Konsole geschrieben wird. Denn das Objekt verfügt zwar über eine Methode mit dem Namen valueOf, jedoch ist diese Methode nicht auf dem Instanzobjekt selbst definiert, sondern sie wird über die Prototypenkette von Object.prototype geerbt.
Verwendung in Schleife
Einen besonderen Nutzen hat die Methode hasOwnProperty in dem Fall, dass unter Verwendung einer Schleife mit for und in über die Eigenschaften eines Objektes iteriert wird. Denn hierbei werden standardmäßig alle Eigenschaften berücksichtigt, sowohl die dem Objekt eigenen als auch solche, die über die Prototypenkette geerbt wurden, sofern der Wert des internen Attributes [[Enumerable]] der jeweiligen Eigenschaft true ist, die Eigenschaft also abzählbar ist. Da aber in der Regel nur die eigenen Eigenschaften eines Objektes berücksichtigt werden sollen, bietet es sich in diesem Fall an, den auszuführenden Anweisungen eine entsprechende Überprüfung mittels hasOwnProperty vorzuschalten.
const planet = {
shape : 'sphere'
};
const mercury = Object.create(planet);
mercury.color = 'grey';
for (let name in mercury) {
if (mercury.hasOwnProperty(name)) {
console.log(name); // color
}
}
In diesem Beispiel wird zunächst in Literalschreibweise ein Objekt mit einer Eigenschaft erzeugt und in der Konstante mit dem Bezeichner planet hinterlegt. In einem zweiten Schritt wird dann ein weiteres Objekt erzeugt, diesmal jedoch unter Verwendung der Methode create des Konstruktors Object, wobei eine Referenz auf das zuvor erstellte Objekt beim Aufruf als Argument übergeben wird. Dadurch wird der Prototyp des Objektes mercury auf das Objekt planet gesetzt, sodass es die auf diesem Objekt definierte Eigenschaft erbt. Zudem wird auf dem zweiten erstellten Objekt noch eine eigene Eigenschaft definiert.
Als nächstes wird dann mittels einer Schleife mit for und in über die Eigenschaften des Objektes mercury iteriert, deren Schlüssel vom Datentyp String sind. Dabei werden nun grundsätzlich nicht nur die eigenen Eigenschaften berücksichtigt, sondern auch die Eigenschaften, welche über die Prototypenkette an das Objekt vererbt wurden, also im Beispiel auch die Eigenschaft mit dem Namen shape, welche von planet geerbt wird. Da jedoch nur die eigenen Eigenschaften berücksichtigt werden sollen, wird die Anweisung, den jeweiligen Eigenschaftsnamen in der Konsole auszugeben, vom Rückgabewert der Methode hasOwnProperty abhängig gemacht.
Entsprechend wird im Ergebnis nur der Name der eigenen Eigenschaft des Objektes mercury in die Konsole geschrieben, also die Zeichenkette color, wohingegen die vom Prototypen geerbte Eigenschaft mit dem Namen shape nicht berücksichtigt wird.
Symbole als Schlüssel
Grundsätzlich gilt, dass die Methode hasOwnProperty nicht nur für die Prüfung von Eigenschaften verwendet werden kann, deren Schlüssel vom Datentyp String ist. Das heißt, es kann genauso geprüft werden, ob ein Objekt eine eigene Eigenschaft besitzt, deren Schlüssel vom Datentyp Symbol ist.
const key = Symbol('description');
const object = {
[key] : 'value'
};
console.log(object.hasOwnProperty(key)); // true
In diesem Beispiel wird zunächst durch den Aufruf der Funktion Symbol ein Symbol erzeugt und gespeichert. Danach wird ein Objekt erstellt und dabei eine Eigenschaft definiert, wobei unter Verwendung der Syntax für berechnete Eigenschaftsnamen (Computed Property Names), also mittels eckiger Klammern, als Schlüssel für die Eigenschaft das zuvor erzeugte Symbol angegeben wird. Die abschließende Prüfung mit der Methode hasOwnProperty zeigt, dass auch bei dieser Eigenschaft das korrekte Ergebnis ermittelt wird.
Eigenschaftsattribute
Bei der Verwendung der Methode hasOwnProperty spielt es im Übrigen keine Rolle, welche Werte die internen Attribute einer Eigenschaft besitzen, oder ob es sich dabei um eine Dateneigenschaft oder um einen Getter oder Setter handelt. Sprich, das einzige vorauf es ankommt ist, ob die Eigenschaft auf dem Objekt definiert ist, auf dem die Methode aufgerufen wurde.
const sun = {
color : 'yellow',
radius : 696342
};
Object.defineProperty(sun, 'color', {
enumerable : false
});
console.log(sun.hasOwnProperty('color')); // true
Hier wird wie in den Beispielen weiter oben zunächst in Literalschreibweise ein Objekt mit zwei Eigenschaften erzeugt und einer Konstante als Wert zugwiesen. Da bei Eigenschaften die mittels Zuweisung (Assignment) angelegt werden der Standardwert für das Attribut [[Enumerable]] true ist, wird dies in einem weiteren Schritt durch Aufruf der Methode defineProperty geändert. Die abschließende Überprüfung mittels hasOwnProperty zeigt, dass die Eigenschaft auf dem Objekt gefunden wird, obwohl sie nicht abzählbar ist.
Eigene Eigenschaften
Die Methode hasOwnProperty besitzt wie die meisten eingebauten Methoden zwei eigene Eigenschaften, nämlich die Eigenschaft length und die Eigenschaft name. Beide Eigenschaften sind schreibgeschützt, können jedoch durch explizite Definition verändert werden, wovon jedoch prinzipiell abzuraten ist.
const method = Object.prototype.hasOwnProperty;
console.info(method.name); // hasOwnProperty
console.info(method.length); // 1
Die Eigenschaft name gibt, wie der Eigenschaftsname bereits vermuten lässt, den Namen der Methode zurück, also die Zeichenkette hasOwnProperty. Der Wert der Eigenschaft length ist 1
, was der Anzahl der formalen Parameter der Methode entspricht.
Weblinks
Object.prototype.hasOwnProperty | ECMAScript 2015 | ECMAScript 2016 | ECMAScript 2017 Draft |