super.prop assignment can silently overwrite non-writable properties
Allen Wirfs-Brock
allen at wirfs-brock.com
Mon Apr 20 17:44:45 UTC 2015
On Apr 20, 2015, at 9:38 AM, Jason Orendorff wrote:
> We're implementing `super` in Firefox, and ran across this surprising behavior:
>
> class X {
> constructor() {
> Object.defineProperty(this, "prop", {
> configurable: true,
> writable: false,
> value: 1});
> }
> f() {
> super.prop = 2; // overwrites non-writable property!
> }
> }
>
> var x = new X();
> x.f();
> assertEq(x.prop, 2); // passes
>
> In the spec, 9.1.9 step 4.d.i. is where `super.prop = 2` ends up, with
> O=X.prototype.
4.d.1 doesn't set the property, it just comes up with the property descriptor to use, if the `Receiver` does not already have a corresponding own property.
5.c+5.e checks if the corresponding own property actually exists on the `Receiver`. If it already exits then it does a [[DefineOwnProperty]] that only specifies the `value` attribute. This should respect the current `writable` attribute of the property and hence reject the attempt to change the value.
So, sounds like a FF bug to me. Of course, there might also be a problem in the spec. that I'm blind to.
Allen
More information about the es-discuss
mailing list