Работает ли 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 шт):
Это исключение, прописанное в спецификации. Для неконфигурируемых свойств можно сменить writable c true на false, но не наоборот, то есть вернуть потом не получится. Логика в том, что можно усилить защиту свойства, но не ослабить её.
Вот тут есть историческое объяснение:
The rationale behind this anomaly is historical: Property
.lengthof Arrays has always been writable and non-configurable. Allowing itswritableattribute to be changed enables us to freeze Arrays.