Spec-Zone.ru › JavaScript

TypeError: не удается определить свойство "x": "obj" не является расширяемым

Исключение JavaScript "не удается определить свойство "x": "obj" не является расширяемым" возникает, когда объект помечен как нерасширяемый, так что он никогда не будет иметь свойств, помимо тех, которые у него были на момент его пометки как нерасширяемого. Объекты могут быть сделаны нерасширяемыми путем вызова Object.preventExtensions(), Object.seal() или Object.freeze().

Сообщение

TypeError: Cannot add property x, object is not extensible (V8-based)
TypeError: Cannot define property x, object is not extensible (V8-based)
TypeError: can't define property "x": Object is not extensible (Firefox)
TypeError: Attempting to define property on object that is not extensible. (Safari)

Тип ошибки

TypeError

Что пошло не так?

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

Примеры

Добавление новых свойств к нерасширяемым объектам

В строгом режиме попытка добавить новые свойства к нерасширяемому объекту путем присваивания вызывает TypeError. В обычном режиме добавление свойства "x" игнорируется без уведомления.

"use strict";

const obj = {};
Object.preventExtensions(obj);

obj.x = "foo";
// TypeError: can't define property "x": Object is not extensible

Как в строгом режиме, так и в обычном режиме, вызов Object.defineProperty() вызывает ошибку при добавлении нового свойства к нерасширяемому объекту.

const obj = {};
Object.preventExtensions(obj);

Object.defineProperty(obj, "x", { value: "foo" });
// TypeError: can't define property "x": Object is not extensible

Нерасширяемые объекты, созданные другими средствами

Методы Object.seal() и Object.freeze() также создают нерасширяемые объекты — они просто имеют дополнительные ограничения на изменение существующих свойств.

"use strict";

const obj = { y: "bar" };
Object.seal(obj);
obj.x = "foo";
// TypeError: can't define property "x": Object is not extensible

Исправление ошибки

Существует три способа исправить эту ошибку: вы можете полностью удалить добавление свойства, если оно вам не нужно, вы можете скопировать существующие свойства в новый расширяемый объект или вы можете добавить свойство перед тем, как сделать объект нерасширяемым.

"use strict";

const obj = {};
obj.x = "foo"; // add property first and only then prevent extensions

Object.preventExtensions(obj);

См. также

  • Object.preventExtensions()
  • Object.seal()
  • Object.freeze()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cant_define_property_object_not_extensible

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API