Ist es möglich, dass die non-enumerable-Eigenschaft geerbt Namen eines Objektes?
In JavaScript haben wir ein paar Wege, um die Eigenschaften eines Objekts, je nachdem, was wir wollen, zu bekommen.
1) Object.keys()
gibt alle eigenen, aufzählbaren Eigenschaften eines Objekts, einer ECMA5 Methode.
2) for...in
Schleife, die liefert alle aufzählbaren Eigenschaften eines Objekts, unabhängig davon, ob Sie eigene Eigenschaften, vererbt von der Prototyp-Kette.
3) Object.getOwnPropertyNames(obj)
gibt alle Eigenschaften eines Objekts Durchlaufen werden kann oder nicht.
Wir haben auch solche Methoden wie hasOwnProperty(prop)
lässt uns überprüfen, ob ein Eigenschaft vererbt wird oder tatsächlich gehört, dass Objekt und propertyIsEnumerable(prop)
die, wie der name schon sagt, lässt uns überprüfen, ob eine Eigenschaft aufzählbar.
Mit all diesen Optionen gibt es keine Möglichkeit, um eine nicht-zählbare, nicht-eigenen Eigenschaft eines Objekts, die ist, was ich tun will. Gibt es eine Möglichkeit, dies zu tun? In anderen Worten, kann ich irgendwie eine Liste der geerbten nicht-zählbare Eigenschaften?
Danke.
Das ist es, was SO alles geht!
InformationsquelleAutor dkugappi | 2011-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit
getOwnPropertyNames
bekommen Sie nicht-zählbare Eigenschaften, die Sie verwenden können, und kombinieren Sie es mit die Prototypkette aufwärts.Getestet habe ich das unter Safari 5.1 und bekam
Update: Refactoring den code ein wenig (mehr Räume, und die geschweiften Klammern, und verbessert die Funktion, name):
Und einfach mal alles..(enum/nonenum, selbst - /geerbt..
Bitte bestätigen..
while(curr = Object.getPrototypeOf(cure))
, wie die bedingte Anweisung verwendet einen Zuweisungsoperator statt Vergleichsoperator, würde dies nicht immer true zurück? Oder ist diese Linie im wesentlichen der überprüfung, ob "curr" hat ein Prototyp?false wird zurückgegeben, wenn das Ergebnis ist falsy, die auftreten, wenn
Object.getPrototypeOf(cure)
zurücknull
an der Spitze der Prototypen-Kette. Ich denke, dies übernimmt keine kreisförmigen Prototyp-Ketten!niemals können die "Stamm" - Prototyp, da es der Prototyp der link verweist auf
Object.prototype
. Die FunktionObject.getPrototypeOf( obj )
gibt das oberste Objekt in der Prototypkette desobj
. Es ermöglicht Ihnen, Folgen die Prototyp-Kette vonobj
bis zu seinem Ende (dernull
Wert). Ich bin mir nicht sicher, was Ihr Problem ist...Nein, es ist nicht
undefined
.Object.getPrototypeOf(John)
gibt dieBoy.prototype
Objekt (wie es sollte) - siehe hier: jsfiddle.net/aeGLA/1. Beachten Sie, dass der KonstruktorBoy
ist nicht in der Prototyp-Kette vonJohn
. Die Prototyp-Kette vonJohn
ist wie folgt:Boy.prototype -> Object.prototype -> null
."ich dachte Objekt.getPrototypeOf(obj) return obj-constructor prototype" - "ja". Im Fall von
John
sein Konstruktor istBoy
, und dieprototype
Eigenschaft vonBoy
istBoy.prototype
. SoObject.getPrototypeOf(John)
zurückBoy.prototype
.InformationsquelleAutor airportyh
Erhalten alle geerbten Eigenschaften oder Methoden für eine Instanz, die Sie könnte so etwas wie das
Object.getInherited
eher alsObject.prototype.getInherited
. Tun, das entfernt auch die Notwendigkeit für die hässlichen!(name == 'getInherited')
überprüfen. Auch in Ihrer Implementierung, dieprops
array enthalten kann, die doppelte Eigenschaften. Schließlich, was ist der Zweck der Nichtbeachtung derconstructor
Eigenschaft?Ich Stimme mit Ihnen überein.
Wann wird Objekt.getInherited wahr werden? Bitte prüfen Sie die unten stehende Frage ist, wie ich bin stecken mit Vererbung: stackoverflow.com/questions/31718345/...
InformationsquelleAutor Milan Jaric
Nutzen-Sets führt zu einer etwas saubereren Lösung, IMO.
InformationsquelleAutor rich remer
Eine saubere Lösung mit Rekursion:
Bearbeiten
Mehr generische Funktionen:
Diese Vorlage kann angewendet werden, mit
Object.getOwnPropertySymbols
usw.InformationsquelleAutor Josh Klodnicki
Hier ist die Lösung, die ich kam mit, während das Studium das Thema. Um alle nicht-zählbare, nicht-eigene Eigenschaften des
obj
Objekt zu tungetProperties(obj, "nonown", "nonenum");
InformationsquelleAutor golem
Beispiel für die Verwendung:
InformationsquelleAutor Dmitry Ragozin
wenn Sie versuchen, sich nicht aufzählbaren Eigenschaften eines übergeordneten Objekts ab. standardmäßig werden die Methoden in einer Klasse definiert, die in es6 sind auf Prototypen aber eingestellt sind als nicht-zählbare.
InformationsquelleAutor Rahil Ahmad