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