Назовите основные случаи использования объекта.определить собственность?
Я читал о свойствах данных в учебнике Javascript и представляю себе использование Object.defineProperty
только в сочетании с свойствами доступа.
Назовите другие основные случаи использования объекта.defineProperty для установки атрибутов: [[Enumerable]]
, [[Writable]]
, [[Configurable]]
? Используется ли он в фреймворках? По каким причинам? Используется ли он в клиентских приложениях?
1 ответ:
И, как вы уже упомянули, они могут быть использованы для геттеров и сеттеров. Синтаксис объектного литерала работает только при создании новых объектов. Чтобы создать новые геттеры / сеттеры в существующем объекте (например, прототипе), вы должны использовать
Object.defineProperty
в общем случае полезно копировать дескрипторы свойств из одного объекта в другой с помощью соответствующих методовObject.getOwnPropertyNames()
иObject.getOwnPropertyDescriptor()
, например, при объединении объектов в прототип.Object.defineProperty()
или скопировать дескрипторы, как указано выше.[[перечисляемый]]
Полезно избегать перечисления через
Object.keys()
, например ... в циклах, добавление свойств к подклассам массива и тому подобное. Это очень важно при добавлении полифил во встроенные прототипы, особенноObject.prototype
, поскольку вы не хотите, чтобы ваши добавленные методы внезапно появлялись в циклах, поскольку это может нарушить другой код, который не выполняет проверку.hasOwnProperty()
.[[Доступно Для Записи]], [[Конфигурируемо]]
Они на самом деле не являются "полезными" в том смысле, что позволяют новые стили программирования, но они являются функциями здравомыслия, которые позволяют создавать свойства только для чтения, которые не могут быть перезаписаны или удалены случайно. Так что да, это здорово для библиотек.
Object.freeze()
/.seal()
/.preventExtensions()
расширьте этот вид защиты дальше до точки, где вы могли бы защитить объекты достаточно, чтобы создать несколько безопасных JavaScript eval sandboxes, защищая прототипы встроенных объектов.