Работает ли defineProperty с неконфигурируемыми свойствами?

Источник

configurable – если true, свойство можно удалить, а атрибуты можно изменять, иначе этого делать нельзя.

Получается, что configurable со значением false запрещает удалять св-во и изменять его атрибуты.

Хорошо, с удалением все работает как надо, но вот атрибуты можно изменить и со значением false.

let obj = {
    name: 'Eva',
    greeting () {
        return this.name;
    }
};

Object.defineProperty(obj, 'greeting', {
    configurable: false //нет возможности удалить св-во, изменять атрибуты
});

Object.defineProperty(obj, 'greeting', {
    writable: false //изменение атрибута
});

console.log(Object.getOwnPropertyDescriptor(obj, 'greeting')); //writable false

Как так?


Ответы (1 шт):

Автор решения: vsemozhebuty

Это исключение, прописанное в спецификации. Для неконфигурируемых свойств можно сменить writable c true на false, но не наоборот, то есть вернуть потом не получится. Логика в том, что можно усилить защиту свойства, но не ослабить её.

Вот тут есть историческое объяснение:

The rationale behind this anomaly is historical: Property .length of Arrays has always been writable and non-configurable. Allowing its writable attribute to be changed enables us to freeze Arrays.

→ Ссылка