On Nov 21, 2012, at 1:55 AM, David Bruant wrote:
> Le 21/11/2012 01:06, Allen Wirfs-Brock a écrit :
>>>>> b) that all the elements of the result are Strings
>>>>
>>>> And presumably Symbols. We have to also accommodate Symbols, at least for
>>>> getOwnPropetyNames. Regardless, why is this important? More below...
>>>>
>>>> Same argument as above.
>>>>
>>>> I recall there was some concern about symbols showing up in existing
>>>> reflection methods like Object.getOwnPropertyNames. Not sure how that got
>>>> resolved. It's basically touching upon the same issue of whether we can
>>>> change the return type of existing methods.
>>
>> I'm assuming we are excluding symbols from [[Enumerate]] and [[Keys]]
> Why so? I would assume unique symbols to show up for these.
I believe that the POR is that Symbol keys are never enumerated (even if
associated with a the property attribute that has [[Enumerable]]: true). I
suppose a proxy could violate that invariant (I wouldn't want to actively
enforce it) but would be a buggy proxy.
>
>> so it is only [[GetOwnPropertyNames]] that have this concern.
> and of course non-enumerable unique symbols for this operation.
ie, private Symbols
(private Symbols, not only are always non-enumerable. They are never reflected
by primitive operation unless the symbol value is explicitly presented as an
argument. You can getOwnPropertyDescriptor using a private symbol, but
getOwnPropertyNames never includes them)
>
> For both case, I think returning unique symbols work as long as ES6 doesn't
> consider that objects have built-in unique-symboled properties (because that
> could probably break existing code).
I assume by unique-symbol you mean the samething as private symbol. The above
will hold, assuming we make @@interator, @@toStringTag, @@hasInstance, etc.
private symbols. While they need to be well-known, I don't see any reason why
they shouldn't also be private.
>
>> One way or another we have to be able to reflectively get a list of symbol
>> keyed properties.
>>
>> We can either:
>> 1) include them in the Object.getOwnPropertyNames result.
> 1bis) Make all built-in symbols (like @iterable) private
>> 2) Consider getOwnPropertyNames depreciated (it actually lives forever) and
>> replace it with a new Object.getOwnPropertyKeys that includes non-private
>> Symbol keys
>> 3) Keep getOwnPropertyNames as is and add Object.getOwnPropertySymbols that
>> only returns the non-private-Symbol keys.
>>
>> 1) has the greatest backward compat concerns, but is the simplest to provide
>> and for ES programmers to deal with going forward.
> Since the use of Object.getOwnPropertyNames may not be widespread, maybe that
> making non-enumerable unique symbol properties could do the trick (as it has
> with new {Object, Array, etc.}.prototype additions)
>
> 1bis) If all standard built-in names are private, they're not enumerated,
> neither in for-in, Object.keys, Object.getOwnPropertyNames and you can have a
> unique name in any of these enumeration operation if you've added them
> manually, so, no backward compat (or close enough that it's acceptable in my
> opinion)
>> 2) Eliminates the compat risk but creates perpetual potential for a: used
>> gOPNames when I should have used gOPK hazard.
>> 3) Eliminates the compat risk but means everybody who wants to deal with all
>> own properties have to deal with two lists of keys. They also loose
>> relative insertion order info relating key/symbol property keys.
>
> It's a bit unfortunate to make all built-in symbols private (because they
> ought to be unique), but it feels like something acceptable.
> It may induce a bit of boilerplate for proxy whitelists (because all built-in
> names like @iterable would need to be added), but a built-in constructor
> helper that would generate sets with all built-in names in it could solve
> that issue easily.
Good point about the white lists, that changes my mind about making the
built-in symbols private. I think I'd prefer to take the risks of alternative
1 rather than forcing proxy writers to deal with them in white lists. I think
there is probably a greater risk of people messing up whitelisting than that
there will be campat. issues with gOPN. Note that even in legacy code, if a
gOPN symbol valued element is used in any context that requires a property
key, things will still work fine. It is only explicitly doing string
manipulation on a gOPN element that would cause trouble. For example, trying to
string prefix every element a list of own property names.
My second choice would be adding getOwnPropertyKeys. I would also only want to
have a getOwnPropertyKeys internal method/trap and would defined
getOwnPropertyNames as filtering that list.
Allen
>
> David
>
> [1] http://wiki.ecmascript.org/doku.php?id=strawman:enumeration
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss