2015-11-24 4 views
6

Je sais que vous pouvez obtenir un objet descripteur de propriété d'une certaine propriété 'prop' d'un certain objet obj avec Object.getOwnPropertyDescriptor(obj,"prop");. Je me demandais juste: où sont stockés ces objets? Sont-ils stockés en interne dans un objet ou .... ailleurs? J'ai essayé de les trouver dans les outils de développement, mais sans chance.Où sont stockés les objets de descripteur de propriété?

+2

De ma lecture la spécification, appelle à cette fonction [finissez ici] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty), où il construit le retour d'un tas de différents [ [propriétés internes]] '. Ces propriétés n'ont pas besoin d'être exposées à l'exécution finale, mais certaines implémentations peuvent les rendre disponibles, par exemple dans les outils de développement. Votre salaire peut varier ... –

+1

Ils sont stockés là où une implémentation particulière choisit de les stocker, ou plus probablement, ils sont construits lorsque demandé. –

Répondre

1

Les objets de descripteur de propriété n'existent pas à moins d'une demande explicite. Ils sont créés ad hoc lorsque vous call Object.getOwnPropertyDescriptor. Donc code suivant:

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

exploitez toujours false.

Ainsi que nous le voyons (à la fois le code et la spécification), les objets de descripteur de propriété ne sont pas stockés, mais créés à la demande.

Alors, où sont writable, configurable, value, get, set ... atributtes stockés? La spécification n'exige pas qu'ils soient exposés au code d'utilisateur ... Here is C++ definition for V8 PropertyDescriptor class - il semble que chaque propriété occupe un octet.

Et si vous voulez vérifier si la propriété est modifiable, configurable ou similaire, console Firefox vous permettent de le faire (mais seulement si la propriété est en lecture seule ou a getter/setter): Firefox DevTools

+0

Mais * aucun objet * - par rapport à un autre objet - renvoie false? Par exemple '[1,2,3] == [1,2,3]' est aussi 'false' – Danield

+1

Les objets sont comparés par référence (" c'est ** le même ** objet "), pas par valeur (" c'est ** objet ** identique "). Par exemple. 'var a = {}, b = a; a === b; // true' – Ginden

+0

oui, vous avez raison :) – Danield