Unconfigurable properties: why can I change [[Writable]] from true to false?

# Axel Rauschmayer (12 years ago)

The ECMAScript 5.1 spec says (8.6.1):

[[Configurable]]: If false, attempts to delete the property, change the property to be an accessor property, or change its attributes (other than [[Value]]) will fail.

On the other hand [[DefineOwnProperty]] (8.12.9) allows one to change writability from true to false, even if a property is not configurable:

10 Else, if IsDataDescriptor(current) and IsDataDescriptor(Desc) are both true, then
	a. If the [[Configurable]] field of current is false, then
		i. Reject, if the [[Writable]] field of current is false and the [[Writable]] field of Desc is true.
		ii. If the [[Writable]] field of current is false, then
			1. Reject, if the [[Value]] field of Desc is present and SameValue(Desc.[[Value]], current.[[Value]]) is false.
	b. else, the [[Configurable]] field of current is true, so any change is acceptable.

(10.a) seems to ignore the case of [[Writable]] of current being true. Is this deliberate?

Should the description of [[Configurable]] be changed to better reflect the status quo?

# Tom Van Cutsem (12 years ago)

The fact that [[writable]] can change for a non-configurable property is definitely intentional, see the state diagram MarkM once put up at < doku.php?id=es3.1:attribute_states&s=diagram>.

Cheers, Tom

2013/6/10 Axel Rauschmayer <axel at rauschma.de>

# Allen Wirfs-Brock (12 years ago)

The corresponding text describing [[Configurable]] in the ES6 draft has already been updated to clarify that [[Writable]] can always be set to false.

# Axel Rauschmayer (12 years ago)

Excellent.