It makes perfect sense for Object.defineProperty, but maybe not so much sense 
for PutValue(). One idea was to just add an `return false if 
existingDescriptor.[[Writable]] is false.` Before 
receiver.[[DefineOwnProperty]]()`. 

> On Apr 20, 2015, at 8:17 PM, Allen Wirfs-Brock <[email protected]> wrote:
> 
> 
>> On Apr 20, 2015, at 12:42 PM, Caitlin Potter wrote:
>> 
>> Oh — he’s right, ValidateAndApplyPropertyDescriptor won’t throw in the 
>> example case, because the old descriptor is configurable. That’s kind of 
>> weird.
> 
> It is kind of weird, but that was what TC39 decided on back when ES5 was 
> being developed.  The logic was that if a property is configurable then it is 
> possible to change all of its attributes  by performing a 
> [[DefineOwnProperty]] with a complete property description.   Because of that 
> possibility, all changes made via a partial property descriptor are also 
> accepted.  In other words:
> 
> var o = Object.create(null, {x:{value: 0, writable: false, enumerable: true, 
> configurable:true}});
> Object.defineProperty(o,' x', {value:2});
> console.log(o.x); //2
> 
> The define property above is allowed because it could have been replaced with 
> the sequence :
> Object.defineProperty(o,'x', {writable: true});
> Object.defineProperty(o,'x', {value: 2, writable: false});
> 
> or even by:
> delete o.x;
> Object.defineProperty(o,'x', {value: 2, writable: false, enumerable: true, 
> configurable: true};)
> 
> hence, we might as well accept the single line version.
> 
> In retrospect, perhaps not such a good idea. 
> 
> Allen
> 
> 
> 
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to