2015-10-09 2 views
0

Есть ли способ удалить дескрипторы свойств с Object.defineProperty? Дескриптор configurable может быть true. Удаление свойства и его добавление - это один из способов сделать это, но есть ли встроенный способ?Удалить дескрипторы свойств в Javascript

+0

, но если вы его удалите - вы просто полностью удалите, не так ли? но если ваша цель - оставить там свойство, почему бы просто не установить его на нуль? – Daemedeor

+0

Я хочу удалить только дескрипторы свойств, а не значения свойств. Я бы сохранил значение во временной переменной, удалил его и вернул. Он работает в большинстве случаев, но кажется «взломанным». –

ответ

0

Object.defineProperty технически не означает «набор дескрипторов свойств»; он устанавливает флаги, значение и getter/setter на основе дескриптора свойства. Поэтому нет смысла говорить «удалить дескриптор свойства»; имеет смысл сказать «удалить свойство» или «переопределить свойство».

Способ удаления объекта недвижимости - delete. Если вы хотите добавить его обратно, то вы добавите его обратно.

Способ переопределить свойство - это переопределить его. Невозможно выборочно модифицировать некоторые из флагов свойства. Object.defineProperty - это все или ничего. Поэтому, если вы хотите изменить что-то вроде writeable, то да, вы должны снова позвонить Object.defineProperty со всем набором новых ключей. Это аналогично вопросу о том, как добавить set в свойство после того, как оно уже определено с помощью get. Невозможно просто добавить set. Вы должны переопределить имущество с помощью getи a set.

Вы можете позвонить Object.getOwnPropertyDescriptor, чтобы получить дескриптор, содержащий текущие флаги и т. Д., Затем измените его и вызовите с ним Object.defineProperty. Это полностью заменит предыдущее свойство (если оно будет настраиваться). Это не взлом; это просто способ сбросить флаги свойства. Кстати, нет особой необходимости в delete.

Однако, как только вы установили свойство с флагом configurable, установленным на false, вам в значительной степени не повезло. Мало того, что вы не можете переопределить это свойство, вы даже не можете удалить его, чтобы определить его заново.

0

Невозможно изменить дескриптор свойства, если для его флага configurable установлено значение false. Как MDN states:

TypeError выбрасывается при попытке изменить атрибуты не конфигурируемые свойств (кроме записываемого атрибута), если текущие и новые значения не совпадают.

Итак, ваш Hacky подход является единственным способом для достижения этой цели.

Это означает, что по какой-либо причине свойства заданы как неконфигурируемые, и если ваше приложение полагается на возможность конфигурирования неконфигурируемых свойств, возможно, в вашем приложении есть запах кода.

+0

Но также невозможно удалить свойство, если для его «настраиваемого» флага установлено значение false. –

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