super.prop assignment can silently overwrite non-writable properties
Allen Wirfs-Brock
allen at wirfs-brock.com
Tue Apr 21 00:17:43 UTC 2015
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
More information about the es-discuss
mailing list