Good argument. However, the fact that the wide adoption `private` and
`public` in other languages constitutes an immediately understood,
well-recognized syntax for declaring privilege levels in languages with
classes is my primary reason for adopting those already reserved keywords.
The fact that I also think it would be a waste not to use them is just a
personal bias I'm willing to disregard in the face of a good, sound,
logical reason for not using them.

On Fri, Aug 3, 2018 at 4:07 PM Jordan Harband <ljh...@gmail.com> wrote:

> A keyword being reserved is NOT the same as "being a part of ES".
> `package` is reserved too, but there's zero concept of packages in the
> language, and absolutely no obligation for there ever to be one.
>
> To reiterate, the existence of `private`, `public`, and `protected` as
> reserved keywords in *no way* justifies including any, or all, of these
> keywords in any language feature.
>
> On Fri, Aug 3, 2018 at 12:36 PM, Isiah Meadows <isiahmead...@gmail.com>
> wrote:
>
>> My "private symbols" proposal supports it, but that's about it.
>>
>> I think the main thing is that the use case isn't really that large,
>> so nobody's really thought about it. (You can always "pretend" it
>> exists by creating a single private key that's just an object
>> dictionary.)
>> -----
>>
>> Isiah Meadows
>> cont...@isiahmeadows.com
>> www.isiahmeadows.com
>>
>>
>> On Fri, Aug 3, 2018 at 8:34 AM, Michael Theriot
>> <michael.lee.ther...@gmail.com> wrote:
>> > If I understand the terminology, "private dynamic properties" are easily
>> > polyfilled via weakmaps?
>> >
>> > I actually think it's odd there is no attempt to implement dynamic
>> > properties in the other "private properties" proposals.
>> >
>> >
>> > On Friday, August 3, 2018, Isiah Meadows <isiahmead...@gmail.com>
>> wrote:
>> >>
>> >> Okay, now that I look at that proposal, I see two issues right off:
>> >>
>> >> 1. It's *super incredibly boilerplatey* and verbose syntactically. I
>> >> don't know very many people who'd be willing to downgrade very far
>> >> from even what TypeScript has. (I'm specifically referring to the
>> >> declarations here.)
>> >> 2. `protected` on an object literal is next to useless. I've used that
>> >> kind of feature almost never.
>> >>
>> >> I also find it odd you're supporting private dynamic properties. It
>> >> does make polyfilling next to impossible, though.
>> >>
>> >> Just my 2 cents on it. (I glanced over this while very tired, so I
>> >> probably missed several highlights. These are what stuck out to me.)
>> >>
>> >> -----
>> >>
>> >> Isiah Meadows
>> >> cont...@isiahmeadows.com
>> >> www.isiahmeadows.com
>> >>
>> >>
>> >> On Wed, Aug 1, 2018 at 11:54 PM, Ranando King <king...@gmail.com>
>> wrote:
>> >> >
>> https://github.com/rdking/proposal-object-members/blob/master/README.md
>> >> >
>> >> > On Wed, Aug 1, 2018 at 2:01 AM Isiah Meadows <isiahmead...@gmail.com
>> >
>> >> > wrote:
>> >> >>
>> >> >> Do you have a link to this proposal so I can take a look at it? It'd
>> >> >> be much easier to critique it if I could see the proposal text.
>> >> >> -----
>> >> >>
>> >> >> Isiah Meadows
>> >> >> cont...@isiahmeadows.com
>> >> >> www.isiahmeadows.com
>> >> >>
>> >> >>
>> >> >> On Wed, Aug 1, 2018 at 2:18 AM, Ranando King <king...@gmail.com>
>> wrote:
>> >> >> >> If you go back a few months, what you're proposing is *very*
>> >> >> >> similar,
>> >> >> >> at
>> >> >> >> least functionally, to my previous iteration of my proposal:
>> >> >> >
>> >> >> > That functional similarity is intentional. After pouring over
>> years
>> >> >> > worth of
>> >> >> > posts, I figured out what the vast majority of the
>> >> >> > proposal-class-fields
>> >> >> > detractors actually wanted: an elegant, easily recognized syntax
>> for
>> >> >> > adding
>> >> >> > private members to objects.
>> >> >> >
>> >> >> >> My main problem was that trying to limit private properties to
>> >> >> >> objects
>> >> >> >> created within a scope got complicated in a hurry once you
>> >> >> >> considered
>> >> >> >> all
>> >> >> >> the small details, and it just didn't seem simple anymore.
>> >> >> >
>> >> >> > I noticed that about your proposal too. I'm also pretty sure that
>> >> >> > Daniel
>> >> >> > E.
>> >> >> > and Kevin G. ran into the same issues back during the
>> >> >> > proposal-private-names
>> >> >> > days which is why the private names concept is just an
>> implementation
>> >> >> > detail
>> >> >> > in their current proposal. My proposal is made less complicated by
>> >> >> > breaking
>> >> >> > the problem down into the 3 pieces required to make it all work:
>> >> >> > 1. a record to store private data
>> >> >> > 2. an array to hold references to the schema records of accessible
>> >> >> > private
>> >> >> > data
>> >> >> > 3. a schema record for the sharable data.
>> >> >> >
>> >> >> > In this way private = encapsulated on a non-function, protected =
>> >> >> > private +
>> >> >> > shared, and static = encapsulated on a function. It should be
>> easy to
>> >> >> > sort
>> >> >> > out how the data would be stored given such simple definitions.
>> These
>> >> >> > simple
>> >> >> > definitions also mean that encapsulation is naturally confined to
>> >> >> > definitions. Attempts to alter that state lead to strange logical
>> >> >> > contradictions and potential leaks of encapsulated data. I have
>> >> >> > thought
>> >> >> > of
>> >> >> > the possibility that private data could be added after definition,
>> >> >> > but
>> >> >> > every
>> >> >> > attempt I make to consider such a thing has so far led to a risk
>> of
>> >> >> > leaking.
>> >> >> >
>> >> >> > I've been working on some code that can serve as a
>> proof-of-concept
>> >> >> > in
>> >> >> > ES6.
>> >> >> > It will implement all of my proposal that can reasonably be
>> >> >> > implemented
>> >> >> > in
>> >> >> > ES6 using Proxy. It's already in the proposal repository under the
>> >> >> > POC
>> >> >> > branch, but it's still a WIP. For now, it already supports
>> inheriting
>> >> >> > from
>> >> >> > native objects. I'm working on subclassing right now. By the time
>> I
>> >> >> > get
>> >> >> > done
>> >> >> > (likely this coming Monday), it should support every feature in my
>> >> >> > proposal.
>> >> >> > I'm basically using it as a means to check the viability of my
>> >> >> > proposal.
>> >> >> >
>> >> >> > On Tue, Jul 31, 2018 at 4:35 PM Isiah Meadows
>> >> >> > <isiahmead...@gmail.com>
>> >> >> > wrote:
>> >> >> >>
>> >> >> >> If you go back a few months, what you're proposing is *very*
>> >> >> >> similar,
>> >> >> >> at least functionally, to my previous iteration of my proposal:
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> https://github.com/isiahmeadows/private-symbol-proposal/blob/c5c9781d9e76123c92d8fbc83681fdd3a9b0b319/README.md
>> >> >> >>
>> >> >> >> My main problem was that trying to limit private properties to
>> >> >> >> objects
>> >> >> >> created within a scope got complicated in a hurry once you
>> >> >> >> considered
>> >> >> >> all the small details, and it just didn't seem simple anymore. It
>> >> >> >> only
>> >> >> >> got more complicated when you started getting into the logistics
>> of
>> >> >> >> integrating with modules.
>> >> >> >>
>> >> >> >> So I've considered the issue and explored it pretty thoroughly -
>> I
>> >> >> >> *really* don't want private data to be limited to classes (which
>> I
>> >> >> >> dislike), but I did also previously have the concern of trying to
>> >> >> >> limit who could define properties where.
>> >> >> >>
>> >> >> >> I will point out that you can prevent arbitrary private
>> extension by
>> >> >> >> simply doing `Object.preventExtensions(object)`. Because
>> properties
>> >> >> >> defined using private symbols are otherwise just normal
>> properties,
>> >> >> >> they still have to go through the same access checks normal
>> >> >> >> properties
>> >> >> >> have to, like [[IsExtensible]]. The only other concrete
>> difference
>> >> >> >> is
>> >> >> >> that proxy hooks don't fire when you do things with private
>> symbols.
>> >> >> >>
>> >> >> >> -----
>> >> >> >>
>> >> >> >> Isiah Meadows
>> >> >> >> cont...@isiahmeadows.com
>> >> >> >> www.isiahmeadows.com
>> >> >> >>
>> >> >> >>
>> >> >> >> On Tue, Jul 31, 2018 at 3:09 PM, Ranando King <king...@gmail.com
>> >
>> >> >> >> wrote:
>> >> >> >> >> What use case are you referring to here?
>> >> >> >> >
>> >> >> >> > In the case of SymbolTree, the objects in use are external.
>> >> >> >> >
>> >> >> >> >> I think there’s been a misunderstanding. Everybody agrees that
>> >> >> >> >> that’s a
>> >> >> >> >> bad pattern. It’s not what the point of private symbols would
>> be.
>> >> >> >> >> It’s
>> >> >> >> >> not a
>> >> >> >> >> target use case.
>> >> >> >> >
>> >> >> >> > That certainly puts my mind at ease.
>> >> >> >> >
>> >> >> >> >> As Isiah said, “all of the examples here I've presented are
>> for
>> >> >> >> >> scenarios
>> >> >> >> >> where the state is related to the factory that created the
>> >> >> >> >> objects.”
>> >> >> >> >
>> >> >> >> > If the factory that creates the objects is the also the only
>> thing
>> >> >> >> > trying to
>> >> >> >> > store private information on those objects, then I understand
>> >> >> >> > you're
>> >> >> >> > only
>> >> >> >> > looking for per-instance module-private data, possibly with the
>> >> >> >> > ability
>> >> >> >> > to
>> >> >> >> > use common private names. If that's the case, then it really is
>> >> >> >> > just
>> >> >> >> > 2
>> >> >> >> > simple extensions of my proposal:
>> >> >> >> > * allow a Symbol when used as a private or protected property
>> name
>> >> >> >> > to
>> >> >> >> > persist as the private Symbol name for the private instance
>> field
>> >> >> >> > on
>> >> >> >> > each
>> >> >> >> > object for which it is used.
>> >> >> >> > * create an additional privilege level (internal) that places
>> the
>> >> >> >> > new
>> >> >> >> > field's name in the [[DeclarationInfo]] of the function
>> containing
>> >> >> >> > the
>> >> >> >> > declaration.
>> >> >> >> >
>> >> >> >> > The effect of using these 2 features together is that anything
>> >> >> >> > within
>> >> >> >> > the
>> >> >> >> > same function as the declared Symbol will gain access to the
>> >> >> >> > internal
>> >> >> >> > field
>> >> >> >> > of all objects using that Symbol as a field name.
>> >> >> >> >
>> >> >> >> > On Tue, Jul 31, 2018 at 1:36 PM Darien Valentine
>> >> >> >> > <valentin...@gmail.com>
>> >> >> >> > wrote:
>> >> >> >> >>
>> >> >> >> >> > I'd say you've identified the common pattern, but that
>> pattern
>> >> >> >> >> > itself
>> >> >> >> >> > is
>> >> >> >> >> > a bad use case, and the use of private symbols as you have
>> >> >> >> >> > defined
>> >> >> >> >> > them
>> >> >> >> >> > doesn't do anything to correct the technical issue.
>> >> >> >> >>
>> >> >> >> >> I think there’s been a misunderstanding. Everybody agrees that
>> >> >> >> >> that’s a
>> >> >> >> >> bad pattern. It’s not what the point of private symbols would
>> be.
>> >> >> >> >> It’s
>> >> >> >> >> not a
>> >> >> >> >> target use case.
>> >> >> >> >>
>> >> >> >> >> > Since you cannot stick new properties onto a non-extensible
>> >> >> >> >> > object,
>> >> >> >> >> > even
>> >> >> >> >> > private symbols won't solve the problem with your use case.
>> >> >> >> >>
>> >> >> >> >> That appending private symbols to external objects which are
>> >> >> >> >> frozen
>> >> >> >> >> wouldn’t work doesn’t matter precisely because it’s not a
>> target
>> >> >> >> >> use
>> >> >> >> >> case.
>> >> >> >> >> That it doesn’t work reliably might even be considered a
>> >> >> >> >> positive,
>> >> >> >> >> since it
>> >> >> >> >> discourages something we all seem to agree is not good
>> practice.
>> >> >> >> >>
>> >> >> >> >> It’s also not related to private symbols; this is already how
>> >> >> >> >> properties
>> >> >> >> >> work, regardless of what kind of key they have.
>> >> >> >> >>
>> >> >> >> >> > The difference here is that in your use cases, library A is
>> >> >> >> >> > "sneakily"
>> >> >> >> >> > storing information on object B.
>> >> >> >> >>
>> >> >> >> >> What use case are you referring to here? I can’t find any
>> example
>> >> >> >> >> in
>> >> >> >> >> the
>> >> >> >> >> previous posts that matches these descriptions. As Isiah said,
>> >> >> >> >> “all
>> >> >> >> >> of
>> >> >> >> >> the
>> >> >> >> >> examples here I've presented are for scenarios where the
>> state is
>> >> >> >> >> related to
>> >> >> >> >> the factory that created the objects.” The same is true of my
>> >> >> >> >> examples.
>> >> >> >> >> Everybody’s on the same page regarding not wanting to add
>> >> >> >> >> properties
>> >> >> >> >> to
>> >> >> >> >> objects their own libraries do not create.
>> >> _______________________________________________
>> >> es-discuss mailing list
>> >> es-discuss@mozilla.org
>> >> https://mail.mozilla.org/listinfo/es-discuss
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to