Ok. I just updated the proposal.
Since T.J. felt so strongly about the use of the word "template", I removed
it from the proposal. No need to raise unnecessary ire.
Since using `new` to trigger the behavior is a no-go just like pragmas, I
introduced 2 new well known Symbols.
* `Symbol.SafeProto = Symbol("SafeProto")` to mark objects that should
exhibit the new behavior.
* `Symbol.UnsafeProto = Symbol("UnsafeProto")` to mark objects that **must
not** exhibit the new behavior.

On Tue, Nov 27, 2018 at 1:13 PM Jordan Harband <[email protected]> wrote:

> Correct, existing code *used with* existing code can't break. It's totally
> fine for existing code that works with objects produced by new code to
> break.
>
> On Tue, Nov 27, 2018 at 11:05 AM Ranando King <[email protected]> wrote:
>
>> Is this to say that no new feature is allowed to introduce breaking
>> changes in existing code?
>>
>> On Tue, Nov 27, 2018 at 1:00 PM Jordan Harband <[email protected]> wrote:
>>
>>> What I meant by "preserve existing behavior" is that *all current code*
>>> must retain the footgun. Any chance must only apply to new code that
>>> explicitly opts in to it.
>>>
>>> On Tue, Nov 27, 2018 at 10:55 AM Ranando King <[email protected]> wrote:
>>>
>>>> > Not something you'd want to do often...
>>>>
>>>> Or ever. This is the foot-gun behavior. The same result can be achieved
>>>> with a simple factory class.
>>>> ```js
>>>> class Example {
>>>>   //Don't use "this". It was flagged to use the updated prototype
>>>> behavior.
>>>>   return Object.create(Example.prototype);
>>>> }
>>>> Example.prototype.sharedObject = {
>>>> counter: 0
>>>> };
>>>> const e1 = new Example();
>>>> const e2 = new Example();
>>>> console.log(e2.sharedObject.counter); // 0
>>>> ++e1.sharedObject.counter;
>>>> console.log(e2.sharedObject.counter); // 1
>>>> ```
>>>> This is what I meant when I said that the existing behavior isn't lost.
>>>> There are still plenty of ways to achieve the foot-gun behavior if that is
>>>> what's desired. What this proposal seeks is a means of making the most
>>>> common path foot-gun free.
>>>>
>>>> Besides, a cleaner result can be achieved by using a static property.
>>>> ```js
>>>> class Example {
>>>> }
>>>> Example.counter = 0;
>>>>
>>>> const e1 = new Example();
>>>> const e2 = new Example();
>>>> console.log(e2.constructor.counter); // 0
>>>> ++e1.constructor.counter;
>>>> console.log(e2.constructor.counter); // 1
>>>> ```
>>>>
>>>>
>>>> On Tue, Nov 27, 2018 at 10:30 AM T.J. Crowder <
>>>> [email protected]> wrote:
>>>>
>>>>> On Tue, Nov 27, 2018 at 3:34 PM Ranando King
>>>>> <[email protected]> wrote:
>>>>> > The fact that the prototype is a 1st class, (usually) mutable
>>>>> > object doesn't change the fact that it is a template.
>>>>>
>>>>> It fundamentally does, calling prototypes templates rather
>>>>> short-changes them. Again, they're live objects:
>>>>>
>>>>> ```js
>>>>> class Example {
>>>>> }
>>>>> const e = new Example();
>>>>> console.log(e.foo); // undefined
>>>>> Example.prototype.foo = "bar";
>>>>> console.log(e.foo); // "bar"
>>>>> ```
>>>>>
>>>>> (http://jsfiddle.net/pot8cdq6/) A *template* wouldn't demonstrate
>>>>> that sort of behavior. Perhaps it's just a semantic point, though.
>>>>>
>>>>> > As for changing `new` in an incompatible way, doesn't represent a
>>>>> > significant or incompatible change in the behavior of `new`.
>>>>>
>>>>> Of course it does. If it didn't, it wouldn't solve the problem you
>>>>> describe wanting to solve. Or was there some opt-in (other than the 
>>>>> pragma)
>>>>> that I missed? The problem you describe is perfectly valid current code:
>>>>>
>>>>> ```js
>>>>> class Example {
>>>>> }
>>>>> Example.prototype.sharedObject = {
>>>>> counter: 0
>>>>> };
>>>>> const e1 = new Example();
>>>>> const e2 = new Example();
>>>>> console.log(e2.sharedObject.counter); // 0
>>>>> ++e1.sharedObject.counter;
>>>>> console.log(e2.sharedObject.counter); // 1
>>>>> ```
>>>>>
>>>>> (http://jsfiddle.net/m49jsxof/) Not something you'd want to do often,
>>>>> but perfectly valid and I expect there are use cases for it, which 
>>>>> changing
>>>>> it would break.
>>>>>
>>>>> Re the rest: Yes, it's complicated to solve for nested properties. But
>>>>> again, you just repeat the pattern, and/or use a Proxy; you can certainly
>>>>> preserve prototypes as needed. The way in which you do so will vary
>>>>> dramatically depending on what your use case is and how much you want to
>>>>> copy, etc.
>>>>>
>>>>> I certainly don't see adding new semantics to `new`. I could see a
>>>>> library function setting things up for you, but I think the patterns would
>>>>> be so project-specific that it's unlikely to go into the standard library.
>>>>>
>>>>> I'll step back at this point.
>>>>>
>>>>> Best,
>>>>>
>>>>> -- T.J. Crowder
>>>>>
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>
>>>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to