Duplicate property names (was Re: @@new)
Allen Wirfs-Brock
allen at wirfs-brock.com
Wed Jun 25 08:21:50 PDT 2014
yes, this is covered by http://people.mozilla.org/~jorendorff/es6-draft.html#sec-__proto__-property-names-in-object-initializers
__proto__ only has special meaning within a production:
PropertyDefiniton : PropertyName ":" AssignmentExpression
and when PropertyName is not a ComputedPropertyName.
All other PropertyDefinition forms that have __proto__ as the property name (whether literally or as a ComputedPropertyName) just define ordinary properties with the name "__proto__".
The current non-duplicated name restriction made it illegal to have more than one __proto__ : something property definitions in an object literal. Because __proto__: something is a special form with its own semantics I think we should continue to make it illegal to have more than one of them, even when we relax the duplicate rule for regular property definitions.
Allen
On Jun 25, 2014, at 8:09 AM, Erik Arvidsson wrote:
> If I recall correctly the intent was that __proto__ was special syntax for setting the [[Prototype]]. So only three following cases are setting the [[Prototype]]
>
> {__proto__: object}
> {'__proto__': object}
> {"__proto__": object}
>
> Other combinations set an own property:
>
> {['__proto__']: object}
> {'__\u0070roto__]: object}
> {__proto__() {}}
> var __proto__;
> {__proto__}
> {get __proto__() {}}
> {set __proto__(x) {}}
>
> Combining these leads to confusing code (so don't do that) but the semantics is clear.
>
>
> On Wed, Jun 25, 2014 at 9:27 AM, Andy Wingo <wingo at igalia.com> wrote:
> On Wed 25 Jun 2014 15:19, Andy Wingo <wingo at igalia.com> writes:
>
> > Hi,
> >
> > On Fri 20 Jun 2014 15:16, "Mark S. Miller" <erights at google.com> writes:
> >
> >> On Fri, Jun 20, 2014 at 1:48 AM, Andy Wingo <wingo at igalia.com> wrote:
> >> >
> >> > There is one change:
> >> >
> >> > ({ foo: 3, get foo() { return 4 } })
> >> >
> >> This is not allowed with current sloppy mode.
> >>
> >> Yes, good catch. This is a change, and it is now allowed.
> >
> > What about:
> >
> > ({ get __proto__() {}, __proto__: foo }) // (1)
> >
> > Does this end up setting the prototype of the result? Would it if there
> > were a setter?
> >
> > Likewise:
> >
> > ({ __proto__: foo, get __proto__() {} }) // (2)
> >
> > This one is kinda similar:
> >
> > ({ ['__proto__']: 34, __proto__: foo }) // (3)
>
> And another one:
>
> ({ get __proto__() {}, __proto__: foo, set __proto__(x) {} })
>
> Does the resulting accessor have a setter and a getter, or just a
> setter? I would think just a setter, in the same way that this one
> would only have a setter:
>
> ({ get qux() {}, qux: foo, set qux(x) {} })
>
> Andy
>
>
>
> --
> erik
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140625/c2fc85ae/attachment.html>
More information about the es-discuss
mailing list