In JavaScript gibt es verschiedene Möglichkeiten, die Eigenschaften eines Objekts abzurufen, je nachdem, was wir abrufen möchten.
1) Object.keys()
, die alle eigenen, aufzählbaren Eigenschaften eines Objekts zurückgibt, eine ECMA5-Methode.
2) eine for...in
Schleife, die alle aufzählbaren Eigenschaften eines Objekts zurückgibt, unabhängig davon, ob es sich um eigene Eigenschaften handelt oder von der Prototypenkette geerbt wurde.
3) Object.getOwnPropertyNames(obj)
die alle eigenen Eigenschaften eines Objekts zurückgibt, ob aufzählbar oder nicht.
Wir haben auch Methoden, mit denen hasOwnProperty(prop)
wir überprüfen können, ob eine Eigenschaft geerbt wurde oder tatsächlich zu diesem Objekt gehört, und mit propertyIsEnumerable(prop)
denen wir, wie der Name schon sagt, überprüfen können, ob eine Eigenschaft aufzählbar ist.
Mit all diesen Optionen gibt es keine Möglichkeit, eine nicht aufzählbare, nicht eigene Eigenschaft eines Objekts zu erhalten, was ich tun möchte. Gibt es eine Möglichkeit, dies zu tun? Mit anderen Worten, kann ich irgendwie eine Liste der geerbten nicht aufzählbaren Eigenschaften erhalten?
Danke dir.
quelle
Antworten:
Da
getOwnPropertyNames
Sie nicht aufzählbare Eigenschaften erhalten, können Sie diese verwenden und mit dem Auflaufen der Prototypenkette kombinieren.Ich habe das auf Safari 5.1 getestet und bekommen
Update: Der Code wurde ein wenig überarbeitet (Leerzeichen und geschweifte Klammern hinzugefügt und der Funktionsname verbessert):
quelle
while(curr = Object.getPrototypeOf(cure))
die bedingte Anweisung einen Zuweisungsoperator anstelle eines Vergleichsoperators verwendet, würde dies nicht immer true zurückgeben? Oder prüft diese Zeile im Wesentlichen, ob "curr" einen Prototyp hat?Object.getPrototypeOf(cure)
kehrtnull
an der Spitze der Prototypkette. Ich denke, dies setzt keine kreisförmigen Prototypenketten voraus!Function.prototype
kann niemals der "Root" -Prototyp sein, da der Prototyp-Link darauf verweistObject.prototype
. Die FunktionObject.getPrototypeOf( obj )
gibt das oberste Objekt in der Prototypenkette von zurückobj
. Sie können der Prototypenkette folgen,obj
bis Sie das Ende (dennull
Wert) erreicht haben. Ich bin nicht sicher, was Ihr Problem damit ist ...undefined
.Object.getPrototypeOf(John)
gibt dasBoy.prototype
Objekt zurück (wie es sollte) - siehe hier: jsfiddle.net/aeGLA/1 . Beachten Sie, dass der KonstruktorBoy
ist nicht in der Prototypkette vonJohn
. Die Prototypkette vonJohn
ist wie folgt :Boy.prototype -> Object.prototype -> null
.John
ist sein KonstruktorBoy
und dasprototype
Eigentum vonBoy
istBoy.prototype
. AlsoObject.getPrototypeOf(John)
kehrt zurückBoy.prototype
.Eine sauberere Lösung mit Rekursion:
Bearbeiten
Allgemeinere Funktionen:
Dieselbe Vorlage kann mit
Object.getOwnPropertySymbols
usw. angewendet werden .quelle
Die Nutzung von Sets führt zu einer etwas saubereren Lösung, IMO.
quelle
Einfach iterativ in ES6:
Beispiellauf:
Code-Snippet anzeigen
quelle
Um alle geerbten Eigenschaften oder Methoden für eine bestimmte Instanz abzurufen, können Sie so etwas verwenden
quelle
Object.getInherited
alsObject.prototype.getInherited
. Dadurch entfällt auch die Notwendigkeit einer hässlichen!(name == 'getInherited')
Überprüfung. In Ihrer Implementierung kann dasprops
Array auch doppelte Eigenschaften enthalten. Was ist der Zweck, dieconstructor
Eigenschaft zu ignorieren ?Hier ist die Lösung, die ich während des Studiums gefunden habe. Um alle nicht aufzählbaren nicht eigenen Eigenschaften des
obj
Objekts zu erhalten, tun Sie diesgetProperties(obj, "nonown", "nonenum");
quelle
Anwendungsbeispiel:
quelle
Wenn Sie versuchen, nicht aufzählbare Eigenschaften eines übergeordneten Objekts zu protokollieren, z. Standardmäßig werden die in einer Klasse in es6 definierten Methoden für den Prototyp festgelegt, jedoch als nicht aufzählbar.
quelle
Eine Umsetzung in meine persönlichen Vorlieben :)
quelle