2015-11-24 6 views
6

Ich weiß, dass Sie ein Property-Deskriptor-Objekt einer bestimmten Eigenschaft 'prop' eines bestimmten Objekts obj mit Object.getOwnPropertyDescriptor(obj,"prop"); erhalten können. Ich habe mich nur gefragt: Wo sind diese Objekte gespeichert? Sind sie intern in einem Objekt gespeichert oder .... anderswo? Ich habe versucht, sie in Entwickler-Tools zu finden, aber ohne Glück.Wo sind die Eigenschaften des Deskriptor-Objekts gespeichert?

+2

Aus meiner Lektüre die Spezifikation, ruft zu dieser Funktion auf (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty), wo sie die Rückkehr von einer Reihe von verschiedenen [] [interne Eigenschaften]] '. Diese Eigenschaften müssen nicht der Endlaufzeitumgebung zur Verfügung gestellt werden, aber einige Implementierungen stellen sie möglicherweise zur Verfügung, z. B. in den Entwicklungstools. Ihr Kilometerstand kann variieren ... –

+1

Sie werden gespeichert, wo immer sich eine bestimmte Implementierung entscheidet, um sie zu speichern, oder, wahrscheinlicher, sie werden konstruiert, wenn sie danach gefragt werden. –

Antwort

1

Eigenschaftsdeskriptorobjekte sind nicht vorhanden, sofern nicht explizit angefordert. Sie werden ad-hoc erstellt, wenn Sie call Object.getOwnPropertyDescriptor. So folgenden Code:

var foo = {bar:'foo'} 
Object.getOwnPropertyDescriptor(foo, 'bar') === Object.getOwnPropertyDescriptor(foo, 'bar'); 

bewerten Sie immer auf false gesetzt.

Wie wir sehen (sowohl Code als auch Spezifikation), werden Property-Deskriptor-Objekte nicht gespeichert, sondern bei Bedarf erstellt.

wo So writable, configurable, value, get, set ... atributtes gespeichert? Spezifikation erfordert nicht, dass sie Benutzercode ausgesetzt werden ... Here is C++ definition for V8 PropertyDescriptor class - es scheint wie jede Eigenschaft ein Byte belegen.

Und wenn Sie überprüfen möchten, ob Eigenschaft beschreibbar, konfigurierbar oder ähnlich ist, Firefox-Konsole ermöglicht es Ihnen, dies zu tun (aber nur, wenn Eigenschaft ist nicht beschreibbar oder hat Getter/Setter): Firefox DevTools

+0

Aber nicht * irgendein Objekt * - im Vergleich zu einem anderen Objekt - Rückgabe false? Zum Beispiel '[1,2,3] == [1,2,3]' ist auch 'false' – Danield

+1

Objekte werden durch Referenz verglichen (" es ist ** das gleiche ** Objekt "), nicht nach Wert (" es ist ** identisches ** Objekt "). Z.B. 'var a = {}, b = a; a === b; // true' – Ginden

+0

ja, du hast recht :) – Danield