d at domenic.me (2015-05-01T12:58:47.344Z)
V8 has implemented the same behavior that Jason has reported.
If it's determined that this behaviour is undesirable, implementations
could agree to do something like:
```
14.5.1 Static Semantics: Early Errors
(extend with...)
ClassTail : ClassHeritage_opt { ClassBody }
ClassBody : ClassElementList
ClassElementList : ClassElement
ClassElement : MethodDefinition
ClassElement : static MethodDefinition
- It is a Syntax Error if ClassHeritage is not present and HasSuperProperty of MethodDefinition is true.
Static Semantics: HasSuperProperty
MethodDefinition : PropertyName ( StrictFormalParameters ) { FunctionBody }
1. If StrictFormalParameters Contains SuperProperty is true, return true.
2. Return FunctionBody Contains SuperProperty.
MethodDefinition : get PropertyName ( ) { FunctionBody }
1. Return FunctionBody Contains SuperProperty.
MethodDefinition : set PropertyName ( PropertySetParameterList ) {
FunctionBody }
1. If PropertySetParameterList Contains SuperProperty is true, return true.
2. Return FunctionBody Contains SuperProperty.
```
Which can then be added to ES2016. Note that the above is adapted from
HasDirectSuper.
On Mon, Apr 20, 2015 at 1:45 PM Allen Wirfs-Brock <allen at wirfs-brock.com> wrote: > > 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. > V8 has implemented the same behavior that Jason has reported. If it's determined that this behaviour is undesirable, implementations could agree to do something like: 14.5.1 Static Semantics: Early Errors (extend with...) ClassTail : ClassHeritage_opt { ClassBody } ClassBody : ClassElementList ClassElementList : ClassElement ClassElement : MethodDefinition ClassElement : static MethodDefinition - It is a Syntax Error if ClassHeritage is not present and HasSuperProperty of MethodDefinition is true. Static Semantics: HasSuperProperty MethodDefinition : PropertyName ( StrictFormalParameters ) { FunctionBody } 1. If StrictFormalParameters Contains SuperProperty is true, return true. 2. Return FunctionBody Contains SuperProperty. MethodDefinition : get PropertyName ( ) { FunctionBody } 1. Return FunctionBody Contains SuperProperty. MethodDefinition : set PropertyName ( PropertySetParameterList ) { FunctionBody } 1. If PropertySetParameterList Contains SuperProperty is true, return true. 2. Return FunctionBody Contains SuperProperty. Which can then be added to ES2016. Note that the above is adapted from HasDirectSuper. Rick -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150420/3d9d03dc/attachment-0001.html>