2015-11-24 14 views
6

So che è possibile ottenere un oggetto descrittore di proprietà di una determinata proprietà 'prop' di un determinato oggetto obj con Object.getOwnPropertyDescriptor(obj,"prop");. Mi stavo chiedendo: dove sono memorizzati questi oggetti? Sono memorizzati internamente all'interno di un oggetto o .... altrove? Ho provato a trovarli negli strumenti di sviluppo ma senza fortuna.Dove sono memorizzati gli oggetti del descrittore di proprietà?

+2

Dalla mia lettura di la specifica, chiama questa funzione [finisce qui] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty), dove costruisce il rendimento di un gruppo di diversi '[ [proprietà interne]] '. Tali proprietà non devono essere esposte al runtime finale, ma alcune implementazioni potrebbero renderle disponibili, ad esempio negli strumenti di sviluppo. La tua miliardaria può variare ... –

+1

Sono conservati ovunque qualsiasi particolare implementazione scelga di memorizzarli, o più probabilmente, vengono costruiti quando richiesto. –

risposta

1

Gli oggetti dei descrittori di proprietà non esistono se non richiesto esplicitamente. Vengono creati ad-hoc quando si call Object.getOwnPropertyDescriptor. Così seguente codice:

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

valutare sempre false.

Così come vediamo (sia il codice che le specifiche), gli oggetti descrittore di proprietà non sono memorizzati, ma creati su richiesta.

Allora, dove sono writable, configurable, value, get, set ... atributtes memorizzati? Le specifiche non richiedono che siano esposte al codice utente ... Here is C++ definition for V8 PropertyDescriptor class - sembra che ogni proprietà occupi un byte.

E se si vuole verificare se la proprietà è scrivibile, configurabile o simili, console di Firefox permettono di farlo (ma solo se la proprietà non è scrivibile o ha getter/setter): Firefox DevTools

+0

Ma non * qualsiasi oggetto * - se confrontato con un altro oggetto - restituisce falso? Ad esempio '[1,2,3] == [1,2,3]' è anche 'false' – Danield

+1

Gli oggetti vengono confrontati per riferimento (" è ** lo stesso ** oggetto "), non per valore (" è ** identico ** oggetto "). Per esempio. 'var a = {}, b = a; una === b; // true' – Ginden

+0

sì, hai ragione :) – Danield

Problemi correlati