Gernar
JavaScript: язык и типы

Какие методы запрещают добавлять свойства в объект

Разбор вопроса «Какие методы запрещают добавлять свойства в объект» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Какие методы запрещают добавлять свойства в объект

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер ожидает, что кандидат знает методы, которые ограничивают модификацию объектов в JavaScript, и понимает разницу между ними. Также важно упомянуть, что эти методы не рекурсивны.

Ключевые тезисы

  • Object.preventExtensions(obj) — запрещает добавление новых свойств к объекту, но позволяет изменять или удалять существующие.
  • Object.seal(obj) — запрещает добавление и удаление свойств, а также делает все существующие свойства неконфигурируемыми.
  • Object.freeze(obj) — полностью замораживает объект, запрещая добавление, удаление и изменение свойств.
  • Эти методы работают только на первом уровне объекта и не затрагивают вложенные объекты.

Подробный ответ

В JavaScript существуют три метода, которые позволяют контролировать изменяемость объектов: Object.preventExtensions, Object.seal и Object.freeze. Каждый из них имеет свои особенности и уровни строгости. Object.preventExtensions(obj) запрещает добавление новых свойств к объекту, но позволяет изменять или удалять существующие. Object.seal(obj) идет дальше: он запрещает как добавление, так и удаление свойств, а также делает все существующие свойства неконфигурируемыми (нельзя изменять их дескрипторы). Object.freeze(obj) — самый строгий метод: он полностью замораживает объект, запрещая добавление, удаление и изменение свойств. Эти методы работают только на первом уровне объекта и не затрагивают вложенные объекты. Это важно учитывать, если объект содержит сложные структуры данных.

Практические примеры

Пример 1

Пример использования Object.preventExtensions: const obj = { prop: 42 }; Object.preventExtensions(obj); obj.newProp = 100; console.log(obj.newProp); // undefined

Пример 2

Пример использования Object.seal: const obj = { prop: 42 }; Object.seal(obj); delete obj.prop; console.log(obj.prop); // 42

Пример 3

Пример использования Object.freeze: const obj = { prop: 42 }; Object.freeze(obj); obj.prop = 100; console.log(obj.prop); // 42

Частые ошибки

  • Ошибка: Предположение, что Object.freeze или Object.seal работают рекурсивно на вложенные объекты. Это не так, и для глубокой заморозки требуется дополнительная реализация.
  • Ошибка: Попытка отменить действие Object.freeze или Object.seal. Эти методы необратимы, и объект нельзя разморозить или 'раскрыть'.

Связанные темы

  • Изучение дескрипторов свойств объектов в JavaScript (Object.defineProperty, Object.getOwnPropertyDescriptor)
  • Разбор концепции иммутабельности в JavaScript и её применения в управлении состоянием (например, в Redux)
  • Изучение работы с Proxy в JavaScript для создания более гибких объектов

Follow-up вопросы

Как проверить, применён ли к объекту метод Object.preventExtensions, Object.seal или Object.freeze?

Уровень: basic

Для проверки используются методы Object.isExtensible(obj) (вернёт false, если preventExtensions/seal/freeze применён), Object.isSealed(obj) (вернёт true для seal/freeze) и Object.isFrozen(obj) (вернёт true только для freeze).

Можно ли отменить действие Object.freeze или Object.seal?

Уровень: intermediate

Нет, эти методы действуют необратимо. После их применения нельзя разморозить или разгерметизировать объект. Единственный вариант — создать копию объекта.

Как работают эти методы с вложенными объектами?

Уровень: intermediate

Методы работают только на первом уровне объекта. Для рекурсивного применения к вложенным объектам нужно реализовать обход вручную или использовать библиотеки типа deep-freeze.

Какие есть практические применения этих методов в реальных проектах?

Уровень: advanced

Используются для защиты конфигурационных объектов, предотвращения случайных изменений в коде, создания иммутабельных структур данных. Особенно полезны в Redux для защиты состояния.

Как эти методы влияют на производительность? Есть ли оверхед при их использовании?

Уровень: advanced

В большинстве случаев оверхед минимален. Однако Object.freeze может немного замедлить доступ к свойствам в горячих путях кода, так как движок JS не сможет оптимизировать объект так же эффективно.

Содержание