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)
Тип ошибки
Что пошло не так?
Обычно объект является расширяемым, и к нему можно добавлять новые свойства. Однако в данном случае объект не является расширяемым, так что он никогда не будет иметь свойств, помимо тех, которые у него были на момент его пометки как нерасширяемого. Вы могли пометить объект как нерасширяемый, вызвав 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);
См. также
© 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