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 <king...@gmail.com> 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 <ljh...@gmail.com> 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 <king...@gmail.com> 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 <
>>> tj.crow...@farsightsoftware.com> wrote:
>>>
>>>> On Tue, Nov 27, 2018 at 3:34 PM Ranando King
>>>> <king...@gmail.com> 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
>>> 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