Атрибут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используется только для удаления свойств объекта (которое может быть удалено) напрямую из указанного объекта. Если свойство объекта -- это последняя оставшаясяссылкана некоторый объект/функцию и вы удаляете его, то ссылка удалится и теперь не имеющий ссылок объект/функция могут быть убраны сборщиком мусора.