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

results matching ""

    No results matching ""