Duplicate property names (was Re: @@new)
Allen Wirfs-Brock
allen at wirfs-brock.com
Wed Jun 25 12:20:39 PDT 2014
On Jun 25, 2014, at 10:27 AM, Erik Arvidsson wrote:
> Allen,
>
> > If propKey is the string value "__proto__"
>
> Do we want to allow "__\u0070roto__" or not? For "use strict" we made it clear that no escape sequences are allowed. I think we should follow that route unless it makes implementation and/or speccing too hard.
I think the usual rules should apply. LiteralPropertyName is either an IdentifierName or a StringLiteral. http://people.mozilla.org/~jorendorff/es6-draft.html#sec-names-and-keywords says the escaped and non-escaped code points are equivalent within an IdentifierName. http://people.mozilla.org/~jorendorff/es6-draft.html#sec-static-semantics-sv-s-and-cv-s says the the SV of is the same for a string containing non-escaped code points and a string containing escapes for the same code points.
That means that {__proto__: something}, {__\u0070roto__: something}, {"__proto__": something}, and {"__\u0070__": something} should all mean the same thing and if Annex B is being implemented that means they all do a [[SetPrototypeOf]].
I think "use strict" is a special care where we were trying to simulate what we would allow in a statement composed of reserved words and escapes are now allowed in keywords. http://people.mozilla.org/~jorendorff/es6-draft.html#sec-reserved-words
Allen
>
>
> On Wed, Jun 25, 2014 at 11:21 AM, Allen Wirfs-Brock <allen at wirfs-brock.com> wrote:
> 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
>
>
>
>
> --
> erik
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140625/067d9549/attachment.html>
More information about the es-discuss
mailing list