Назовите основные случаи использования объекта.определить собственность?


Я читал о свойствах данных в учебнике Javascript и представляю себе использование Object.defineProperty только в сочетании с свойствами доступа.

Назовите другие основные случаи использования объекта.defineProperty для установки атрибутов: [[Enumerable]], [[Writable]], [[Configurable]]? Используется ли он в фреймворках? По каким причинам? Используется ли он в клиентских приложениях?

1 3

1 ответ:

Object.defineProperty в общем случае полезно копировать дескрипторы свойств из одного объекта в другой с помощью соответствующих методов Object.getOwnPropertyNames() и Object.getOwnPropertyDescriptor(), например, при объединении объектов в прототип.

И, как вы уже упомянули, они могут быть использованы для геттеров и сеттеров. Синтаксис объектного литерала работает только при создании новых объектов. Чтобы создать новые геттеры / сеттеры в существующем объекте (например, прототипе), вы должны использовать Object.defineProperty() или скопировать дескрипторы, как указано выше.

[[перечисляемый]]

Полезно избегать перечисления через Object.keys(), например ... в циклах, добавление свойств к подклассам массива и тому подобное. Это очень важно при добавлении полифил во встроенные прототипы, особенно Object.prototype, поскольку вы не хотите, чтобы ваши добавленные методы внезапно появлялись в циклах, поскольку это может нарушить другой код, который не выполняет проверку .hasOwnProperty().

[[Доступно Для Записи]], [[Конфигурируемо]]

Они на самом деле не являются "полезными" в том смысле, что позволяют новые стили программирования, но они являются функциями здравомыслия, которые позволяют создавать свойства только для чтения, которые не могут быть перезаписаны или удалены случайно. Так что да, это здорово для библиотек.

Object.freeze() / .seal() / .preventExtensions() расширьте этот вид защиты дальше до точки, где вы могли бы защитить объекты достаточно, чтобы создать несколько безопасных JavaScript eval sandboxes, защищая прототипы встроенных объектов.