Атрибутconfigurable
Атрибут configurable
одновременно контролирует, может ли свойство быть удалено из объекта и могут ли быть изменены его атрибуты (кроме контроля изменения атрибутаwritable
).
Пример:
var myObject = {
a: 2
};
myObject.a = 3;
myObject.a; // 3
Object.defineProperty( myObject, "a", {
value: 4,
writable: true,
configurable: false, // не конфигурируемо!
enumerable: true
} );
myObject.a; // 4
myObject.a = 5;
myObject.a; // 5
Object.defineProperty( myObject, "a", {
value: 6,
writable: true,
configurable: true,
enumerable: true
} ); // TypeError
Последний вызов defineProperty(..)
приводит к ошибке TypeError, вне зависимости отstrict mode
, если вы пытаетесь изменить значение дескриптора неконфигурируемого свойства. Осторожно: как видите, изменение configurable
на false
необратимо и его нельзя отменить.
Примечание: существует особенное исключение, о котором стоит помнить: если для свойства уже заданоconfigurable:false
, тоwritable
может быть изменено сtrue
наfalse
без ошибки, но не обратно вtrue
если оно ужеfalse
.
А ещеconfigurable:false
препятствует возможности использовать операторdelete
для удаления существующего свойства.
var myObject = {
a: 2
};
myObject.a; // 2
delete myObject.a;
myObject.a; // undefined
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: false,
enumerable: true
} );
myObject.a; // 2
delete myObject.a;
myObject.a; // 2
Как видите, последний вызовdelete
не удался (молча), потому что мы сделали свойствоa
неконфигурируемым.
delete
используется только для удаления свойств объекта (которое может быть удалено) напрямую из указанного объекта. Если свойство объекта -- это последняя оставшаясяссылкана некоторый объект/функцию и вы удаляете его, то ссылка удалится и теперь не имеющий ссылок объект/функция могут быть убраны сборщиком мусора.