2015-11-24 1 views
6

Я знаю, что вы можете получить объект описания объекта определенного объекта 'prop' определенного объекта obj с Object.getOwnPropertyDescriptor(obj,"prop");. Мне просто интересно: где хранятся эти объекты? Сохраняются ли они внутри объекта или ... в другом месте? Я попытался найти их в инструментах разработчика, но не повезло.Где хранятся объекты дескриптора свойств?

+2

Из моего чтения spec, вызывает эту функцию [в конечном итоге здесь] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty), где он создает возврат из кучи разных '[ [внутренние свойства]]. Эти свойства не подвергаются действию на конечную рабочую среду, но некоторые реализации могут сделать их доступными, например, в инструментах dev. Ваше перемещение может варьироваться ... –

+1

Они хранятся там, где любая конкретная реализация предпочитает их хранить, или, более вероятно, они создаются по запросу. –

ответ

1

Объектов дескриптора объекта не существует, если явно не запрошено. Они создаются ad-hoc, когда вы call Object.getOwnPropertyDescriptor. Так следующий код:

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

Всегда оценивайте ложь.

Так как мы видим (как код, так и спецификацию), объекты дескриптора объекта не сохраняются, а создаются по требованию.

Так где writable, configurable, value, get, set ... atributtes хранится? Спецификация не требует, чтобы они подвергались воздействию кода пользователя ... Here is C++ definition for V8 PropertyDescriptor class - Кажется, что каждое свойство занимает один байт.

И если вы хотите проверить, если свойство записи, конфигурируемый или аналогичный, Firefox консоль позволит вам сделать это (но только если свойство не доступен для записи или имеет геттер/сеттер): Firefox DevTools

+0

Но не * любой объект * - по сравнению с другим объектом - возвращает false? Например, '[1,2,3] == [1,2,3]' также 'false' – Danield

+1

Объекты сравниваются по ссылке (« это ** тот же ** объект »), а не по значению (« это ** идентичный ** объект "). Например. 'var a = {}, b = a; === б; // true' – Ginden

+0

да, вы правы :) – Danield

 Смежные вопросы

  • Нет связанных вопросов^_^