TypeError: can't define property "x": "obj" is not extensible

Сообщение

TypeError: Cannot create property for a non-extensible object (Edge)
TypeError: can't define property "x": "obj" is not extensible (Firefox)
TypeError: Cannot define property: "x", object is not extensible. (Chrome)

Тип ошибки

TypeError

Что произошло не так?

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

Примеры

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

'use strict';

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

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

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

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

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

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

'use strict'; 

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

Object.preventExtensions(obj);

Смотрите также