Re: classes and enumerability

2015-01-30 Thread Brendan Eich
Please drop the crappy us vs. them talk. If you read this thread, 
and others on esdiscuss.org, you can see TC39 did not keep ignoring 
feedback. Yeesh!


We (TC39 includes web developers, W3C TAG members, WHATWG members and 
cofounders, all well-connected to others working with and on WebIDL) 
chose to align class prototype method enumerability with ECMA-262 core 
language built-in method enumerability and clearly-voiced developer 
expectations, against the old DOM enumerable-method norm, with the 
intention to bend WebIDL default that way where possible and provide 
decorator-based or better opt-out in the future.


It's not the end of the world that we live with further differences that 
have long stood between core language and browser method enumerability. 
What would be worse in our judgment: enumerability by default.


/be

Anne van Kesteren wrote:

On Fri, Jan 30, 2015 at 7:44 AM, Andrea Giammarchi
andrea.giammar...@gmail.com  wrote:

Developers have to understand they cannot `new HTMLDivElement()` anyway and
they cannot extend WebIDL interfaces in JS world neither.


That will change.

bz and others have been working on bridging the gap for quite a while
now. It's rather frustrating TC39 keeps ignoring the feedback given
while at the same time complaining that DOM and IDL are so different.



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Brendan Eich

Brendan Eich wrote:
Please drop the crappy us vs. them talk. If you read this thread, 
and others on esdiscuss.org, you can see TC39 did not keep ignoring 
feedback. Yeesh!


In case it is not clear: Andrea is not on TC39, not us or them in 
your dichotomy, and while I agree he disregarded (if not disrespected) 
ongoing work to make new HTMLDivElement work -- and that wasn't cool of 
him -- that has zip to do with this decision, or with TC39.


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Yehuda Katz
Worth noting: DOM classes won't be the only objects a JavaScript user
interacts with that have enumerable methods. Virtually 100% of class
libraries in JavaScript, including ones created after ES5, create classes
with enumerable methods.

I don't think that this change has a prayer of making enumerable methods
feel weird in JavaScript any time soon.

Yehuda Katz
(ph) 718.877.1325

On Fri, Jan 30, 2015 at 8:58 PM, Brendan Eich bren...@mozilla.org wrote:

 Andrea Giammarchi wrote:

 Do we agree this class decision was a good one? Perfect, then let's move
 on to another thread and discuss how things could be better from both
 worlds point of view in the future.


 I'm not sure why you replied to me, since I (and everyone on TC39) has
 agreed to make the decision for class methods to be non-enumerable, so we
 must all agree that decision was a good one! :-P

 Probably you're replying to Anne, indirectly.


 /be

 ___
 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


Re: classes and enumerability

2015-01-30 Thread Brendan Eich

Andrea Giammarchi wrote:
Do we agree this class decision was a good one? Perfect, then let's 
move on to another thread and discuss how things could be better from 
both worlds point of view in the future.


I'm not sure why you replied to me, since I (and everyone on TC39) has 
agreed to make the decision for class methods to be non-enumerable, so 
we must all agree that decision was a good one! :-P


Probably you're replying to Anne, indirectly.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


RE: classes and enumerability

2015-01-30 Thread Andrea Giammarchi
Uhm...yes, Anne or Boris, or anyone behind IDL that might have felt 
disrespected.

Best Regards

-Original Message-
From: Brendan Eich bren...@mozilla.org
Sent: ‎31/‎01/‎2015 05:58
To: Andrea Giammarchi andrea.giammar...@gmail.com
Cc: Anne van Kesteren ann...@annevk.nl; es-discuss 
es-discuss@mozilla.org
Subject: Re: classes and enumerability

Andrea Giammarchi wrote:
 Do we agree this class decision was a good one? Perfect, then let's 
 move on to another thread and discuss how things could be better from 
 both worlds point of view in the future.

I'm not sure why you replied to me, since I (and everyone on TC39) has 
agreed to make the decision for class methods to be non-enumerable, so 
we must all agree that decision was a good one! :-P

Probably you're replying to Anne, indirectly.

/be

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Andrea Giammarchi
I didn't mean to disrespect anybody work here, I am just personally a bit
tired of TC39 decisions that, after being already made and widely discussed
in the same thread, are complained/disregarded regardless everyone agreed
already on an official meeting.

I am not TC39 and not even close to WHATWG and didn't know there was an
effort to make `new HTMLDivElement` and all other constructors possible,
but I am also one that created the widely adoptable/backward compatible
polyfill for Custom Elements specifications and its
`document.registerElement` and haven't seen anything even close to that
extendability from the DOM world in JS published these years so ... yeah,
I might have misunderstood that having better classes in JS was seen as a
bad thing from WebIDL prospective and, accordingly, I've (over)reacted as
developer that does things daily to live and cannot work behind a we are
trying to align future promise: I kinda need things to be the right way
today or ASAP, and I'd be surely happy if tomorrow these will be even
better!

Do we agree this class decision was a good one? Perfect, then let's move on
to another thread and discuss how things could be better from both worlds
point of view in the future.

Best Regards



On Fri, Jan 30, 2015 at 7:02 PM, Brendan Eich bren...@mozilla.org wrote:

 Brendan Eich wrote:

 Please drop the crappy us vs. them talk. If you read this thread, and
 others on esdiscuss.org, you can see TC39 did not keep ignoring
 feedback. Yeesh!


 In case it is not clear: Andrea is not on TC39, not us or them in your
 dichotomy, and while I agree he disregarded (if not disrespected) ongoing
 work to make new HTMLDivElement work -- and that wasn't cool of him -- that
 has zip to do with this decision, or with TC39.

 /be

 ___
 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


Re: classes and enumerability

2015-01-30 Thread Anne van Kesteren
On Fri, Jan 30, 2015 at 7:44 AM, Andrea Giammarchi
andrea.giammar...@gmail.com wrote:
 Developers have to understand they cannot `new HTMLDivElement()` anyway and
 they cannot extend WebIDL interfaces in JS world neither.

That will change.

bz and others have been working on bridging the gap for quite a while
now. It's rather frustrating TC39 keeps ignoring the feedback given
while at the same time complaining that DOM and IDL are so different.


-- 
https://annevankesteren.nl/
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Andrea Giammarchi
this will change too ?
`NodeList.prototype.propertyIsEnumerable('length')`

WebIDL is full of inconsistencies compared with JS world and that, talking
about backward compatibility, shouldn't change.

Prototypal inheritance done the old JS way works perfectly and everything
is enumerable.
I rewrite the example you apparently ignored:

```js

var HTMLDivElement = new WebIDL({
  yourDefinitionAsObject() {
  },
  get properties() {
  },
  attributeName: 'value'
});

```

That is just fine as everything enumerable, that is just fine as Interface
definition.

Why should IDL make classes bad for everything in JS land instead of
adopting above pattern in case it does not want to go enumerable?

And again, who actually wants that enumerability and why?

Best Regards



On Fri, Jan 30, 2015 at 10:52 AM, Anne van Kesteren ann...@annevk.nl
wrote:

 On Fri, Jan 30, 2015 at 7:44 AM, Andrea Giammarchi
 andrea.giammar...@gmail.com wrote:
  Developers have to understand they cannot `new HTMLDivElement()` anyway
 and
  they cannot extend WebIDL interfaces in JS world neither.

 That will change.

 bz and others have been working on bridging the gap for quite a while
 now. It's rather frustrating TC39 keeps ignoring the feedback given
 while at the same time complaining that DOM and IDL are so different.


 --
 https://annevankesteren.nl/

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Boris Zbarsky

On 1/30/15 1:44 AM, Andrea Giammarchi wrote:

Developers have to understand they cannot `new HTMLDivElement()` anyway


That will change.


I am not sure why you see this misalignment that has always been there a
problem just now


I've seen it as a problem for a while now, as a cursory look at mailing 
list archives will tell you.



but also I am not sure I understand why this wouldn't
be equivalent:


Do you also not understand why ES6 needed to grow enough primitives to 
explain host objects and so forth?


Basically, the fact that we have two somewhat but not quite different 
things going on is going to be confusing to people, so if we can align 
them we should.



You have already properties and types nobody can set or ensure in native
JS


You can implement the equivalent in native JS nowadays (except for 
document.all).  That's been the point of a lot of the recent evolution 
of JS.  And while the integration between the two is not perfect yet, 
once of the goals of the ES6 class work has been to improve said 
integration.



... and I would never stop a programming language from evolving
because another one (that' how I see WebIDL) is limited or
historically different ... I mean, it is different, it has always been,
why is this a concern only today?


_THIS_ is one of the big problems I see with how the web platform is 
developed.  Some people view it as multiple independent fiefs to be 
developed independently, as opposed to a single coherent platform.



Genuinely curious, but non enumerable for JS classes is **good** and I
believe it should not be re-changed.


Did I suggest it should be re-changed?  Did you even read anything I 
wrote in this thread?  Please go and do so.


-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Boris Zbarsky

On 1/30/15 7:56 AM, Andrea Giammarchi wrote:

this will change too ?
`NodeList.prototype.propertyIsEnumerable('length')`


Changing that is what we're talking about, yes.


WebIDL is full of inconsistencies compared with JS world and that,
talking about backward compatibility, shouldn't change.


The question is whether backwards compat outweighs platform consistency 
here.  For example, does anyone actually depend on length being 
enumerable on a nodelist?  I've seen plenty of people working around it, 
but no one so far depending on it.



That is just fine as everything enumerable, that is just fine as
Interface definition.


Trying to align classes and IDL interfaces is a policy decision that was 
made a while back, fwiw



Why should IDL make classes bad for everything in JS land


I have no idea what imagined strawman you're replying to here, but it 
would be good to spell out what your (incorrect, I think) assumptions 
are if you're going to reply to those assumptions, not to facts.


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Andrea Giammarchi
Boris,
  if you are not pushing back the decision about **non** enumerable methods
in ES6 classes then I think we are good.

About everything else I think it's very risky to change old enumerable
defaults in IDL because libraries are used to check stuff in `Object.keys`
even to polyfill, instead of going with `Object.getOwnPropertyNames` so
while I believe I won't personally ever be hurt by a change in 'length' or
any other enumerable properties in WebIDL once made non enumerable, I am
pretty sure that's a very high-risk breaking change for the Web.

The reason classes could have been fixed in ES6 is that these have never
even landed officially in JS, WebIDL did already, and as ES3 prototypal
like inheritance work in ES6 regardless, anything that requires
enumerability can simply use that inheritance style.

New things could use new class ... I think nobody would be surprised, but
that's just my opinion.

Best Regards




On Fri, Jan 30, 2015 at 2:24 PM, Boris Zbarsky bzbar...@mit.edu wrote:

 On 1/30/15 7:56 AM, Andrea Giammarchi wrote:

 this will change too ?
 `NodeList.prototype.propertyIsEnumerable('length')`


 Changing that is what we're talking about, yes.

  WebIDL is full of inconsistencies compared with JS world and that,
 talking about backward compatibility, shouldn't change.


 The question is whether backwards compat outweighs platform consistency
 here.  For example, does anyone actually depend on length being
 enumerable on a nodelist?  I've seen plenty of people working around it,
 but no one so far depending on it.

  That is just fine as everything enumerable, that is just fine as
 Interface definition.


 Trying to align classes and IDL interfaces is a policy decision that was
 made a while back, fwiw

  Why should IDL make classes bad for everything in JS land


 I have no idea what imagined strawman you're replying to here, but it
 would be good to spell out what your (incorrect, I think) assumptions are
 if you're going to reply to those assumptions, not to facts.

 -Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-30 Thread Boris Zbarsky

On 1/30/15 8:43 AM, Andrea Giammarchi wrote:

The reason classes could have been fixed in ES6 is that these have never
even landed officially in JS, WebIDL did already


WebIDL did nothing of the sort so far.  What we have is various legacy 
behaviors, some of which WebIDL codified.  _That_'s what makes things 
possibly hard to change.


But yes, I'm not sure anything is being added to the discussion here. 
This is all obvious.


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Brendan Eich
Announcement: ES6 class method syntax makes a non-enumerable property of 
the method's name on the class prototype. That is all. :-)


/be

Brendan Eich wrote:

Herby Vojčík wrote:

Personally, I have always believed we are going down the wrong path by
switching (from the original max-in class design) to making methods
defined within a class definition enumerable.


Yes, please, if possible, go back to non-enum methods. I was writing 
at that time as well, but things ended up enumerable. I even cited a 
real-world example (Amber objects used in jQuery API as options 
objects), where enum methods broke the functionality, but non-enum 
methods allowed things to work. 


On the agenda for next week, at 4(iii):

https://github.com/tc39/agendas/blob/master/2015/01.md

/be
___
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


Re: classes and enumerability

2015-01-29 Thread Jeremy Martin
\o/

On Thu, Jan 29, 2015 at 2:55 PM, Brendan Eich bren...@mozilla.org wrote:

 Announcement: ES6 class method syntax makes a non-enumerable property of
 the method's name on the class prototype. That is all. :-)

 /be


 Brendan Eich wrote:

 Herby Vojčík wrote:

 Personally, I have always believed we are going down the wrong path by
 switching (from the original max-in class design) to making methods
 defined within a class definition enumerable.


 Yes, please, if possible, go back to non-enum methods. I was writing at
 that time as well, but things ended up enumerable. I even cited a
 real-world example (Amber objects used in jQuery API as options objects),
 where enum methods broke the functionality, but non-enum methods allowed
 things to work.


 On the agenda for next week, at 4(iii):

 https://github.com/tc39/agendas/blob/master/2015/01.md

 /be
 ___
 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




-- 
Jeremy Martin
661.312.3853
http://devsmash.com
@jmar777
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Yehuda Katz
Very glad to see this happen!

Yehuda Katz
(ph) 718.877.1325

On Thu, Jan 29, 2015 at 11:55 AM, Brendan Eich bren...@mozilla.org wrote:

 Announcement: ES6 class method syntax makes a non-enumerable property of
 the method's name on the class prototype. That is all. :-)

 /be


 Brendan Eich wrote:

 Herby Vojčík wrote:

 Personally, I have always believed we are going down the wrong path by
 switching (from the original max-in class design) to making methods
 defined within a class definition enumerable.


 Yes, please, if possible, go back to non-enum methods. I was writing at
 that time as well, but things ended up enumerable. I even cited a
 real-world example (Amber objects used in jQuery API as options objects),
 where enum methods broke the functionality, but non-enum methods allowed
 things to work.


 On the agenda for next week, at 4(iii):

 https://github.com/tc39/agendas/blob/master/2015/01.md

 /be
 ___
 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


Re: classes and enumerability

2015-01-29 Thread Boris Zbarsky

On 1/29/15 4:36 PM, Yehuda Katz wrote:

Are you asking what to do about the fact that existing WebIDL classes
produce enumerable properties that probably can't be made non-enumerable
without breaking the web?


I think the following things need to be decided:

1)  What should the behavior be for WebIDL objects going forward?
2)  If the going forward behavior is to have properties non-enumerable,
should we try to migrate some subset of the existing Web IDL
objects to the new behavior?

I'm pretty sure we can't migrate all existing things, at least without 
breaking someone somewhere, but I suspect we can migrate many of them, 
if we decide it's actually worthwhile.


I'd be pretty interested in knowing what other implemntors think here, 
because if we make some decision on #1 I'd rather not have people 
continue to ship whatever they do now instead of what we decided on. 
We've been having a _lot_ of that happen with Web IDL.  :(


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Boris Zbarsky

On 1/29/15 4:21 PM, Brendan Eich wrote:

I was hoping someone deeper into WebIDL (and with more time for it than
I have right now :-P) would do that.

I missed the part of the first-day TC39 meeting where this was resolved,
so I hope someone who was there can speak to the WebIDL plan, if any.


Yes, to make this clear, I was talking about people who were at the 
meeting.  I presume that the Web IDL interactions were considered, since 
they came up in the earlier discussion.


-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Yehuda Katz
On Thu, Jan 29, 2015 at 1:27 PM, Boris Zbarsky bzbar...@mit.edu wrote:

 On 1/29/15 4:21 PM, Brendan Eich wrote:

 I was hoping someone deeper into WebIDL (and with more time for it than
 I have right now :-P) would do that.

 I missed the part of the first-day TC39 meeting where this was resolved,
 so I hope someone who was there can speak to the WebIDL plan, if any.


 Yes, to make this clear, I was talking about people who were at the
 meeting.  I presume that the Web IDL interactions were considered, since
 they came up in the earlier discussion.


Are you asking what to do about the fact that existing WebIDL classes
produce enumerable properties that probably can't be made non-enumerable
without breaking the web?




 -Boris


 ___
 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


Re: classes and enumerability

2015-01-29 Thread Boris Zbarsky

On 1/29/15 4:54 PM, Yehuda Katz wrote:

To be completely clear, there's nothing that requires DOM to define its
objects as using precisely the semantics of ES6 classes


Sure.  There is nothing that requires the DOM to define its objects in 
any particular way at all.  As observed in actual implementations, 
nothing even requires them to follow the ES spec in any way whatsoever.


At the same time, there seems to be some general agreement in principle 
that Web IDL should generally look as much like ES6 classes as possible. 
 At least that's my impression.



If I understand you correctly, what you're saying is that you would
*like* DOM classes to look similar to a normally defined ES6 class.


_I_ personally quite honestly don't care one whit whether they do.  But 
a number of other people have voiced such a desire, and I'm willing to 
try to accommodate it.  Especially if TC39 is willing to help and 
actually coordinate things and all that.  And if other implementors are 
willing to actually do so as well.



That is a reasonable desire (and I would love to continue discussing
it), but it's not something that's squarely in TC39's wheelhouse (since
DOM classes aren't defined using ECMAScript class syntax, which is all
that this decision directly affects).


Yes, that's why I suggested that someone who was involved post to 
public-script-coord, which is the right place for that sort of thing.


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Yehuda Katz
Yehuda Katz
(ph) 718.877.1325

On Thu, Jan 29, 2015 at 1:46 PM, Boris Zbarsky bzbar...@mit.edu wrote:

 On 1/29/15 4:36 PM, Yehuda Katz wrote:

 Are you asking what to do about the fact that existing WebIDL classes
 produce enumerable properties that probably can't be made non-enumerable
 without breaking the web?


 I think the following things need to be decided:

 1)  What should the behavior be for WebIDL objects going forward?
 2)  If the going forward behavior is to have properties non-enumerable,
 should we try to migrate some subset of the existing Web IDL
 objects to the new behavior?

 I'm pretty sure we can't migrate all existing things, at least without
 breaking someone somewhere, but I suspect we can migrate many of them, if
 we decide it's actually worthwhile.


To be completely clear, there's nothing that requires DOM to define its
objects as using precisely the semantics of ES6 classes, and indeed,
nothing that stops an ES6 class from having enumerable methods:

class Simple {
}

// enumerable

Simple.prototype.method = function() {}

If I understand you correctly, what you're saying is that you would *like* DOM
classes to look similar to a normally defined ES6 class.

That is a reasonable desire (and I would love to continue discussing it),
but it's not something that's squarely in TC39's wheelhouse (since DOM
classes aren't defined using ECMAScript class syntax, which is all that
this decision directly affects).



 I'd be pretty interested in knowing what other implemntors think here,
 because if we make some decision on #1 I'd rather not have people continue
 to ship whatever they do now instead of what we decided on. We've been
 having a _lot_ of that happen with Web IDL.  :(

 -Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Brendan Eich

Boris Zbarsky wrote:

On 1/29/15 2:55 PM, Brendan Eich wrote:

Announcement: ES6 class method syntax makes a non-enumerable property of
the method's name on the class prototype. That is all. :-)


Please post to public-script-coord with the proposed plan for web idl.


I was hoping someone deeper into WebIDL (and with more time for it than 
I have right now :-P) would do that.


I missed the part of the first-day TC39 meeting where this was resolved, 
so I hope someone who was there can speak to the WebIDL plan, if any.


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Andrea Giammarchi
awesome news!!! thanks for sharing and also curious to know about other non
method properties, including statics.

Just to be aligned, not to complain, I have not a strong opinion except
eventually for getters, that should be non enumerable too for consistency
with what we have natively (e.g. Array#length)

Best Regards

On Thu, Jan 29, 2015 at 8:55 PM, Brendan Eich bren...@mozilla.org wrote:

 Announcement: ES6 class method syntax makes a non-enumerable property of
 the method's name on the class prototype. That is all. :-)

 /be


 Brendan Eich wrote:

 Herby Vojčík wrote:

 Personally, I have always believed we are going down the wrong path by
 switching (from the original max-in class design) to making methods
 defined within a class definition enumerable.


 Yes, please, if possible, go back to non-enum methods. I was writing at
 that time as well, but things ended up enumerable. I even cited a
 real-world example (Amber objects used in jQuery API as options objects),
 where enum methods broke the functionality, but non-enum methods allowed
 things to work.


 On the agenda for next week, at 4(iii):

 https://github.com/tc39/agendas/blob/master/2015/01.md

 /be
 ___
 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


Re: classes and enumerability

2015-01-29 Thread Allen Wirfs-Brock
My sense, from the informal discussions about this at the TC39 meeting, is that 
most of us would hope that new WebIDL abstractions follow the ES6 class 
conventions and that existing WebIDL, because of legacy constrants  abstraction 
are likely not to migrate to the ES6 class conventions. 

Syntactically, in WebIDL, you would presumably need an attribute or something 
to indicate which set of conventions to use for any particular interface.

Allen 
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Boris Zbarsky

On 1/29/15 5:43 PM, Allen Wirfs-Brock wrote:

My sense, from the informal discussions about this at the TC39 meeting, is that 
most of us would hope that new WebIDL abstractions follow the ES6 class 
conventions and that existing WebIDL, because of legacy constrants  abstraction 
are likely not to migrate to the ES6 class conventions.


OK.  Just so we're clear, there are well north of 500 existing Web IDL 
interfaces defined in the web platform.  It will be a while, if ever, 
before the new ones get anywhere close to that.


So what that approach (assuming none of the existing things are 
migrated) does is basically doom the web platform to always having 
behavior that authors can't predict.  I doubt I can actually get on 
board with that course of action  :(



Syntactically, in WebIDL, you would presumably need an attribute or something 
to indicate which set of conventions to use for any particular interface.


Sure.  I'm worried about the goals, not the syntax; the syntax is trivial.

-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Andrea Giammarchi
Developers have to understand they cannot `new HTMLDivElement()` anyway and
they cannot extend WebIDL interfaces in JS world neither.

I am not sure why you see this misalignment that has always been there a
problem just now, but also I am not sure I understand why this wouldn't be
equivalent:

```js

var HTMLDivElement = new WebIDL({
  yourDefinitionAsObject() {
  },
  get properties() {
  },
  attributeName: 'value'
});

```

You have already properties and types nobody can set or ensure in native JS
... and I would never stop a programming language from evolving because
another one (that' how I see WebIDL) is limited or historically different
... I mean, it is different, it has always been, why is this a concern only
today?

Genuinely curious, but non enumerable for JS classes is **good** and I
believe it should not be re-changed.

Best Regards


On Fri, Jan 30, 2015 at 2:51 AM, Boris Zbarsky bzbar...@mit.edu wrote:

 On 1/29/15 5:43 PM, Allen Wirfs-Brock wrote:

 My sense, from the informal discussions about this at the TC39 meeting,
 is that most of us would hope that new WebIDL abstractions follow the ES6
 class conventions and that existing WebIDL, because of legacy constrants
 abstraction are likely not to migrate to the ES6 class conventions.


 OK.  Just so we're clear, there are well north of 500 existing Web IDL
 interfaces defined in the web platform.  It will be a while, if ever,
 before the new ones get anywhere close to that.

 So what that approach (assuming none of the existing things are migrated)
 does is basically doom the web platform to always having behavior that
 authors can't predict.  I doubt I can actually get on board with that
 course of action  :(

  Syntactically, in WebIDL, you would presumably need an attribute or
 something to indicate which set of conventions to use for any particular
 interface.


 Sure.  I'm worried about the goals, not the syntax; the syntax is trivial.

 -Boris


 ___
 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


Re: classes and enumerability

2015-01-29 Thread Yehuda Katz
On Thu, Jan 29, 2015 at 6:43 PM, Boris Zbarsky bzbar...@mit.edu wrote:

 On 1/29/15 9:41 PM, Yehuda Katz wrote:

 I've personally written a lot of code that enumerates over the
 properties of an element or other DOM object for some reason or other. I
 strongly suspect that making existing WebIDL attributes non-enumerable
 would not be web-compatible (nor, or even in the somewhat distant future).


 I agree for elements, and probably all nodes.

 On the other hand, I'm fairly sure that no one depends FormData, say...


Right, but that's precisely your point about API predictability. We
shouldn't mix and match based on whether we can get away with it, or nobody
will have any idea what to expect.




  I would agree that (2) isn't a good option, and I doubt (3) is
 web-compatible ... :tears:


 That's about where I am... and those three options were in fact discussed
 on this list before.

 Ah, well.

 -Boris


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Yehuda Katz
On Thu, Jan 29, 2015 at 5:51 PM, Boris Zbarsky bzbar...@mit.edu wrote:

 On 1/29/15 5:43 PM, Allen Wirfs-Brock wrote:

 My sense, from the informal discussions about this at the TC39 meeting,
 is that most of us would hope that new WebIDL abstractions follow the ES6
 class conventions and that existing WebIDL, because of legacy constrants
 abstraction are likely not to migrate to the ES6 class conventions.


 OK.  Just so we're clear, there are well north of 500 existing Web IDL
 interfaces defined in the web platform.  It will be a while, if ever,
 before the new ones get anywhere close to that.


I've personally written a lot of code that enumerates over the properties
of an element or other DOM object for some reason or other. I strongly
suspect that making existing WebIDL attributes non-enumerable would not be
web-compatible (nor, or even in the somewhat distant future).


 So what that approach (assuming none of the existing things are migrated)
 does is basically doom the web platform to always having behavior that
 authors can't predict.  I doubt I can actually get on board with that
 course of action  :(


I agree that that sounds bad. The options seem to be:

   1. DOM objects don't behave like classes defined with inline methods
   2. Only new DOM objects behave like classes defined with inline methods
   3. Change all DOM objects to behave that way, if we can do so without
   breaking the web

I would agree that (2) isn't a good option, and I doubt (3) is
web-compatible ... :tears:




  Syntactically, in WebIDL, you would presumably need an attribute or
 something to indicate which set of conventions to use for any particular
 interface.


 Sure.  I'm worried about the goals, not the syntax; the syntax is trivial.

 -Boris


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Boris Zbarsky

On 1/29/15 9:41 PM, Yehuda Katz wrote:

I've personally written a lot of code that enumerates over the
properties of an element or other DOM object for some reason or other. I
strongly suspect that making existing WebIDL attributes non-enumerable
would not be web-compatible (nor, or even in the somewhat distant future).


I agree for elements, and probably all nodes.

On the other hand, I'm fairly sure that no one depends FormData, say...


I would agree that (2) isn't a good option, and I doubt (3) is
web-compatible ... :tears:


That's about where I am... and those three options were in fact 
discussed on this list before.


Ah, well.

-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-29 Thread Boris Zbarsky
OK, let's just cc public-script-coord here too.  For those just joining 
in: the question is whether Web IDL prototype members should be 
enumerable given that TC39 just decided that inline-declared methods on 
classes are not enumerable in ES6.


 On 1/29/15 9:45 PM, Yehuda Katz wrote:

Right, but that's precisely your point about API predictability. We
shouldn't mix and match based on whether we can get away with it, or
nobody will have any idea what to expect.


I think that depends on where we can manage to draw the boundary.

For example, drawing the boundary at APIs that go to CR after March 15, 
2015 or some such is ridiculous because no web developer should need to 
care about that.


On the other hand, drawing it at Stuff on nodes is enumerable, stuff on 
everything else is not enumerable is something I could at least live 
with (though there are complications here around EventTarget).


The more complicated the description of what is and isn't enumerable, 
the worse it is, of course; an actual list of just whatever we managed 
to get away with is no good as you say.


-Boris

P.S.  In case I hadn't mentioned it before, there are already UA 
inconsistencies in what's enumerable right now; e.g. in some UAs 
toString on various DOM things with stringifiers is not enumerable.

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-22 Thread Herby Vojčík



Allen Wirfs-Brock wrote:


On Dec 24, 2014, at 1:49 PM, Kevin Smith wrote:


Here is the summary:
Total Files Read: 11038
Files Containing Explicit 'enumerable: false': 149
Occurrences of 'enumerable: false' (and variants): 206


I love this kind of analysis - thanks!

My interpretation of this data is that non-enumerability isn't
important enough to bother with in the vast majority of cases. It
*may* still be that non-enumerability is the least-surprise option for
class methods, but certainly users don't care enough about the issue
currently to bother with typing in enumerable: false.

I'm still concerned about the refactoring hazard argument. I think the
idea is that if I change some ES5-style class into an ES6-style class,
then I need to have good unit tests already in place to make sure that
non-enumerability won't break things. Otherwise, I can't do the refactor.


Let's drill deeper into this concern...

There are two parts of dealing with a class-abstraction, the definition
the class and consuming instances of the class. Let's look at the
enumerability impact on both of those.

Class definition: In an ES5-level class abstraction library, changing
the enumerability of methods might have an impact on class creation, if
the attraction library does something like method copying using for-in.
However, what we are talking about is converting from an ad hoc (and
possibly library provided) ES5 class abstraction to using actual ES6
class definition. Class definitions don't depend upon reflection of
properties to actually create the class. So, I don't think we have
anything to worry about on the class definition side. Enumerability of
properties is irrelevant.

Class consumption: It pretty much comes down to whether or not consumers
of class instances in ES5 use for-in with or without hasOwnProperty
filters to enumerate the properties of class instances. If their ES5
code uses hasOwnProperty to filter out methods, then the fact that ES6
methods are non-enumerable will make no difference. On the other hand,
if consumers of these ES5 class instances are doing for-in enumerations
and want to see inherited methods then there would be an issue. But,
other than for meta programming, it hard to imagine why they would
actually want tfor-in to see any methods.

Some folks at Auburn University have been studying a large corpus of
JavaScript code, see http://munawarhafiz.com/research/jssurvey/
On of the things they've look at is use of for-in and hasOwnProperty.
Take a look at the data shown on that page for for-in usage and read
sections X and XI in the accompany paper.

Personally, I have always believed we are going down the wrong path by
switching (from the original max-in class design) to making methods
defined within a class definition enumerable.


Yes, please, if possible, go back to non-enum methods. I was writing at 
that time as well, but things ended up enumerable. I even cited a 
real-world example (Amber objects used in jQuery API as options 
objects), where enum methods broke the functionality, but non-enum 
methods allowed things to work.



The only real model of class-like abstractions that has always and
universally been a part of JS is the model that the built-in
constructors consistently follow. The ES6 class definition model was
intended to exactly mirror that built-in model. My vision for it was
that future JS programmers should never need to worry about whether a
class was provided by a built-in or from a library or was a local part
of the application, because they all worked the same.

By make class defined methods enumerable, we parted from that simple
vision and instead seem to follow the remediation path that current and
legacy JS programmers had to follow because the language did not give
them the capabilities they need to define classes just like the
built-ins. We're tinking too much about the past and not enough about
the future.

Allen


Herby
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-22 Thread Brendan Eich

Herby Vojčík wrote:

Personally, I have always believed we are going down the wrong path by
switching (from the original max-in class design) to making methods
defined within a class definition enumerable.


Yes, please, if possible, go back to non-enum methods. I was writing 
at that time as well, but things ended up enumerable. I even cited a 
real-world example (Amber objects used in jQuery API as options 
objects), where enum methods broke the functionality, but non-enum 
methods allowed things to work. 


On the agenda for next week, at 4(iii):

https://github.com/tc39/agendas/blob/master/2015/01.md

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-08 Thread medikoo
Rick, I don't think this kind of analysis while promising, will expose real
values.

I think most developers which took the step to use descriptors on everyday
basis, uses factory tools like that one: https://www.npmjs.com/package/d

e.g. alone in my packages you'll find hundreds (if not thousands) of
properties defined on prototypes as enumerable: false, but no single
definition would be picked by your script.




--
View this message in context: 
http://mozilla.6506.n7.nabble.com/classes-and-enumerability-tp329572p331212.html
Sent from the Mozilla - ECMAScript 4 discussion mailing list archive at 
Nabble.com.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2015-01-08 Thread Andrea Giammarchi
bo medikoo, you ruined it :D

the opening and the closing of this thread was so semantic, Santa Claus
speaking !!!

I believe Rick changed his opinion during this discussion and yes, I agree
with you there are tons of utilities/wrapper out there that will try to
automate such definition in order to have non enumerable inherited
properties in (since I believe that's one of the most desired things since
ES3 era)

Best Regards



On Thu, Jan 8, 2015 at 9:44 AM, medikoo medikoo+mozilla@medikoo.com
wrote:

 Rick, I don't think this kind of analysis while promising, will expose
 real
 values.

 I think most developers which took the step to use descriptors on everyday
 basis, uses factory tools like that one: https://www.npmjs.com/package/d

 e.g. alone in my packages you'll find hundreds (if not thousands) of
 properties defined on prototypes as enumerable: false, but no single
 definition would be picked by your script.




 --
 View this message in context:
 http://mozilla.6506.n7.nabble.com/classes-and-enumerability-tp329572p331212.html
 Sent from the Mozilla - ECMAScript 4 discussion mailing list archive at
 Nabble.com.
 ___
 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


Re: classes and enumerability

2014-12-25 Thread Andrea Giammarchi
Considered how this thread started and the exact day of the year a common
agreement happened, I believe the following ending would be more than
appropriate:


Ho Ho Ho
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Brendan Eich
Somehow the thread forked, and I see Kevin Smith already wrote a reply 
on the other branch like mine -- sorry about that. But how did the 
thread fork?


/be

Brendan Eich wrote:

ES5 has Object static methods for getting all own property names,
enumerable or not. Also walking prototype chain. What's the problem
you're thinking of, exactly?

/be

Glen Huang wrote:

I was saying that a feature like lightweight traits is probably
impossible to desugar to es5, if class syntax makes properties and
methods non-enum.

___
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


Re: classes and enumerability

2014-12-24 Thread Glen Huang
Nothing. I forgot about those methods, and Kevin also kindly reminded me.

Thanks for letting me know. :)

 On Dec 24, 2014, at 5:22 PM, Brendan Eich bren...@mozilla.org wrote:
 
 ES5 has Object static methods for getting all own property names,
 enumerable or not. Also walking prototype chain. What's the problem
 you're thinking of, exactly?
 
 /be
 
 Glen Huang wrote:
 
 I was saying that a feature like lightweight traits is probably
 impossible to desugar to es5, if class syntax makes properties and
 methods non-enum.

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Andrea Giammarchi
I've replied to Rick privatly by accident but regardless what I've written
there, which is basically agereing with Brendan on the following sentence:
 It ain't over till it's over. If we can't tweak ES6 to fix a mistake,
just because process, then we're doing it wrong.

and describe why his example can be done anyway (using getOwnPropertyNames
instead of keys) and why object literals shouldn't be affected indeed ...
there is a very strong point to me that is the main bummer ...

```js
class List extends Array {
   itsGoingToBeEnumerable() {
 return 'but does it have to and would you expect to?';
   }
}
```

Not only being fresh new sugar, `class` could bring more than what basic
ES3 prototype assignment has done for 15+ years, forcing historically every
developer to be worried about doomed `for/in` loops and asking randomly any
sort of native methods in specs so that would feel safer 'cause not
enumerable, given the ability to finally subclass natives will mess up
expectations even more: an instanceof Array that could have methods in the
loop and cannot be used as sparse array ... this is just an example that
will doom again subclassing and loops ... does it have to be like this ?

Subclassing is planned and basically unshimmable ... why should we keep
bringing further old gotchas instead of finally cleaning up through a new
syntax that is fully compatible with ES5 when it comes to transpiled
prototype properties definition ?

Please let's make `class` developer friendly, giving them the option to
fallback to classical prototype literal object definition, when and if
needed, providing a better pattern for modern architectures built on top of
ES6, 7 and others.

Thanks for consideration.

Best Regards



On Wed, Dec 24, 2014 at 10:32 AM, Glen Huang curvedm...@gmail.com wrote:

 Nothing. I forgot about those methods, and Kevin also kindly reminded me.

 Thanks for letting me know. :)

  On Dec 24, 2014, at 5:22 PM, Brendan Eich bren...@mozilla.org wrote:
 
  ES5 has Object static methods for getting all own property names,
  enumerable or not. Also walking prototype chain. What's the problem
  you're thinking of, exactly?
 
  /be
 
  Glen Huang wrote:
 
  I was saying that a feature like lightweight traits is probably
  impossible to desugar to es5, if class syntax makes properties and
  methods non-enum.

 ___
 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


Re: classes and enumerability

2014-12-24 Thread Kevin Smith

 ```js
 class List extends Array {
itsGoingToBeEnumerable() {
  return 'but does it have to and would you expect to?';
}
 }
 ```


That's a good point.

As far as I can tell, the downside risk associated with making class
methods non-enumerable centers around mixins:

- Legacy mixin utilities will tend to fail when given ES6 classes.
- We have no built-in function for doing proper mixins yet, and
`Object.assign` won't work at all.

I looked through my ES6 code and found a place where I was using
`Object.assign` as an simplistic mixin function.  It might be a pain to
have to import a userland utility for such cases.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Kevin Smith wrote:
I looked through my ES6 code and found a place where I was using 
`Object.assign` as an simplistic mixin function.


ES5 introspection APIs are enough, and if you're mixing in from an ES6 
class using old code, you face the same non-enumerable-methods surface 
that you would with a built-in class.



  It might be a pain to have to import a userland utility for such cases.


How so?

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Andrea Giammarchi
I don't see any risk around mixins for the following reasons:


   1. mixins are nowhere in specs so any solution is personal/ad-hoc but ...
   2. if you use `Object.assign` you don't do that at class definition
   time, you do that eventually after. This possibility will be unchanged, you
   can still attach whatever you want as enumerable property to the class
   prototype once defined ... the idea here is not to not make that possible
   anymore, rather to have a default definition that is configurable but not
   enumerable (+ writable for methods and values or get/set for get/setters)
   3. using literals to define traits is still the easiest way to go and it
   also define a clear line between a class and a trait. Once ES7 will have
   traits syntax within the class one we can assume traits are imported during
   class definition and, as such, will be assigned non enumerable. This would
   still be the least surprise in my opinion


Moreover, using Object.assign for mixins is already a very poor pattern
'cause also getters and setters will be lost during the procedure, adding
an extra surprise in the middle.

Object.assign is good to extend own properties and copy options and
defatuls values, promoting or using it to define the future of traits in JS
... well, I'd personally wouldn't go for it and think about better
solutions for ES7

Meanwhile, we should be careful to base the present (ES6) and the future
based on what we used to do in ES3, hence a window to improve classses.

Best Regards



On Wed, Dec 24, 2014 at 7:02 PM, Kevin Smith zenpars...@gmail.com wrote:

 ```js
 class List extends Array {
itsGoingToBeEnumerable() {
  return 'but does it have to and would you expect to?';
}
 }
 ```


 That's a good point.

 As far as I can tell, the downside risk associated with making class
 methods non-enumerable centers around mixins:

 - Legacy mixin utilities will tend to fail when given ES6 classes.
 - We have no built-in function for doing proper mixins yet, and
 `Object.assign` won't work at all.

 I looked through my ES6 code and found a place where I was using
 `Object.assign` as an simplistic mixin function.  It might be a pain to
 have to import a userland utility for such cases.


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Kevin Smith

 ES5 introspection APIs are enough, and if you're mixing in from an ES6
 class using old code, you face the same non-enumerable-methods surface that
 you would with a built-in class.


True, and even more so, I like Andrea's point that mixing in getters and
setters requires ES5 APIs anyway (i.e. Object.getOwnPropertyDescriptor).


It might be a pain to have to import a userland utility for such cases.


 How so?


Meaning simply that `Object.mixin` (or whatever it might be called, or
syntax) seems like a standard API gap.  But I suppose it's a gap regardless
of whether class methods are enumerable.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Axel Rauschmayer
The alternative is to treat enumerability the way ES6 treats holes: pretend it 
doesn’t exist:

* Use `Reflect.ownKeys`, `Object.getOwnPropertyNames`, 
`Object.getOwnPropertySymbols` instead of `Object.keys`.
* Don’t use the `for-in` loop (an easy one…)
* Change `Object.assign` so that it considers all properties, not just 
enumerable ones.
* The properties of class prototypes remain non-enumerable.
* I’m unsure about new built-in instance prototypes. For consistency’s sake, 
one may want to make them non-enumerable. But how would they be different from 
a library?

Quoting Sebastian Markbåge: 
https://twitter.com/sebmarkbage/status/547156703104753664

 enumerable is just one of an infinite number of categories you might want 
 to filter on. It's a hack and should die.

Would this approach have any disadvantages?


 On 24 Dec 2014, at 19:02, Kevin Smith zenpars...@gmail.com wrote:
 
 ```js
 class List extends Array {
itsGoingToBeEnumerable() {
  return 'but does it have to and would you expect to?';
}
 }
 ```
 
 That's a good point.
 
 As far as I can tell, the downside risk associated with making class methods 
 non-enumerable centers around mixins:
 
 - Legacy mixin utilities will tend to fail when given ES6 classes.
 - We have no built-in function for doing proper mixins yet, and 
 `Object.assign` won't work at all.
 
 I looked through my ES6 code and found a place where I was using 
 `Object.assign` as an simplistic mixin function.  It might be a pain to have 
 to import a userland utility for such cases.

-- 
Dr. Axel Rauschmayer
a...@rauschma.de
rauschma.de



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Rick Waldron
Inline

On Tue Dec 23 2014 at 10:24:06 PM Brendan Eich bren...@mozilla.org wrote:

 It ain't over till it's over. If we can't tweak ES6 to fix a mistake,
 just because process, then we're doing it wrong. OTOH the bar for any
 change, including what is regarded by many (but not all) as a fix, is
 very high.

 We should take advantage of es-discuss to debate the crucial question,
 which is not whether enumerable prototype methods are the rule or
 exception -- as Rick said, for built-ins (but not all DOM methods),
 non-enumerable is the common case; for user-defined classes prior to ES5
 and Object.defineProperty, enumerable is the norm.

 This is true in the rule/exceptions/confusion sense we all know and hate.


 The question is: what should ES6 classes choose as the default? What's
 the most useful default, independent of various backward-looking
 consistencies? What, if the future is bigger than the past, would be best?


Put in these terms, I still think that maintaining status quo makes sense.
The future _is_ bigger than the past and this can be addressed via
annotations (maybe even in ES7?).

It seems worthwhile to mention non-enumerability has its own problems:
recall that Array.prototype.contains was recently renamed to
Array.prototype.includes exactly because the built-in is non-enumerable by
default. It could've been argued that this was a good reason to break with
that norm and make built-ins enumerable by default. That of course is a
non-starter—so why is breaking enumerable by default for user defined
classes under consideration?

Non-enumerability can still be achieved, it's not pretty (it downright
sucks), but most user code simply doesn't go out of its way to explicitly
define properties as non-enumerable:

- Compiled a list of 600 modules that npm shows as the most depended on (
https://www.npmjs.com/browse/depended, pages 1-10).
- I created a script that installed all 600 modules
- Confirmed installation by attempting to require all of them. Three
created issues when require'ing, but otherwise all modules loaded
(typescript, fstream-ignore, fis-parser-less)
- Globbing node_modules/**/*.js produced 35371 files, so do a naive
filter for paths with test in it (assume this just a test file, whether
that's correct or not, as we'll see: it doesn't matter). Also only look at
a file once by tracking the actual module file path and not the complete
path. This brings the number down to 11038 files.
- Read the source of each file, line by line, counting occurrences of the
following:
  - enumerable: false,
  - enumerable:false,
  - 'enumerable': false
  - 'enumerable':false
  - enumerable: false
  - enumerable:false

Here are all the occurrences, marked by file and line number:
https://gist.github.com/rwaldron/8989d6e7cd7b2f6bfdbb

Here is the summary:
Total Files Read:  11038
Files Containing Explicit 'enumerable: false':  149
Occurrences of 'enumerable: false' (and variants): 206


I was ready to concede until I did this exercise, but I'm holding my
position that the default should remain enumerable. A vocal minority
 shouldn't trump the reality of programmer's expectations.


Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Kevin Smith

 Here is the summary:
 Total Files Read:  11038
 Files Containing Explicit 'enumerable: false':  149
 Occurrences of 'enumerable: false' (and variants): 206


I love this kind of analysis - thanks!

My interpretation of this data is that non-enumerability isn't important
enough to bother with in the vast majority of cases.  It *may* still be
that non-enumerability is the least-surprise option for class methods, but
certainly users don't care enough about the issue currently to bother with
typing in enumerable: false.

I'm still concerned about the refactoring hazard argument.  I think the
idea is that if I change some ES5-style class into an ES6-style class, then
I need to have good unit tests already in place to make sure that
non-enumerability won't break things.  Otherwise, I can't do the refactor.

What do we think about that one?

Kevin
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Rick Waldron
On Wed Dec 24 2014 at 4:49:36 PM Kevin Smith zenpars...@gmail.com wrote:

 Here is the summary:
 Total Files Read:  11038
 Files Containing Explicit 'enumerable: false':  149
 Occurrences of 'enumerable: false' (and variants): 206


 I love this kind of analysis - thanks!


I was actually inspired by a similar report you created for the list in the
past.



 My interpretation of this data is that non-enumerability isn't important
 enough to bother with in the vast majority of cases.


Yes, this was my interpretation as well.


 It *may* still be that non-enumerability is the least-surprise option for
 class methods, but certainly users don't care enough about the issue
 currently to bother with typing in enumerable: false.

 I'm still concerned about the refactoring hazard argument.  I think the
 idea is that if I change some ES5-style class into an ES6-style class, then
 I need to have good unit tests already in place to make sure that
 non-enumerability won't break things.  Otherwise, I can't do the refactor.


Agreed: this has also been my main argument when the subject has come up in
the past.

Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Allen Wirfs-Brock

On Dec 24, 2014, at 1:49 PM, Kevin Smith wrote:

 Here is the summary: 
 Total Files Read:  11038
 Files Containing Explicit 'enumerable: false':  149
 Occurrences of 'enumerable: false' (and variants): 206
 
 I love this kind of analysis - thanks!
 
 My interpretation of this data is that non-enumerability isn't important 
 enough to bother with in the vast majority of cases.  It *may* still be that 
 non-enumerability is the least-surprise option for class methods, but 
 certainly users don't care enough about the issue currently to bother with 
 typing in enumerable: false.
 
 I'm still concerned about the refactoring hazard argument.  I think the idea 
 is that if I change some ES5-style class into an ES6-style class, then I need 
 to have good unit tests already in place to make sure that non-enumerability 
 won't break things.  Otherwise, I can't do the refactor.

Let's drill deeper into this concern...

There are two parts of dealing with a class-abstraction, the definition the 
class and consuming instances of the class.  Let's look at the enumerability 
impact on both of those.

Class definition: In an ES5-level class abstraction library, changing the 
enumerability of methods might have an impact on class creation, if the 
attraction library does something like method copying using for-in.  However, 
what we are talking about is converting from an ad hoc (and possibly library 
provided) ES5 class abstraction to using actual ES6 class definition.  Class 
definitions don't depend upon reflection of properties to actually create the 
class.  So, I don't think we have anything to worry about on the class 
definition side. Enumerability of properties is irrelevant.

Class consumption:  It pretty much comes down to whether or not consumers of 
class instances in ES5 use for-in with or without hasOwnProperty filters to 
enumerate the properties of class instances.  If their ES5 code uses 
hasOwnProperty to filter out methods, then the fact that ES6 methods are 
non-enumerable will make no difference.  On the other hand, if consumers of 
these ES5 class instances are doing for-in enumerations and want to see 
inherited methods then there would be an issue. But,  other than for meta 
programming, it hard to imagine why they would actually want tfor-in to see any 
methods.

Some folks at Auburn University have been studying a large corpus of JavaScript 
code, see http://munawarhafiz.com/research/jssurvey/ 
On of the things they've look at is use of for-in and hasOwnProperty.  Take a 
look at the data shown on that page for for-in usage and read sections X and XI 
in the accompany paper.

Personally, I have always believed we are going down the wrong path by 
switching (from the original max-in class design) to making methods defined 
within a class definition enumerable.

The only real model of class-like abstractions that has always and universally 
been a part of JS is the model that the built-in constructors consistently 
follow. The ES6 class definition model was intended to exactly mirror that 
built-in model.  My vision for it was that future JS programmers should never 
need to worry about whether a class was provided by a built-in or from a 
library or was a local part of the application, because they all worked the 
same.

By make class defined methods enumerable, we parted from that simple vision and 
instead seem to follow the remediation path that current and legacy JS 
programmers had to follow because the language did not give them the 
capabilities they need to define classes just like the built-ins.  We're 
tinking too much about the past and not enough about the future.

Allen



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Jeremy Martin
Props to Rick for bringing some analytical rigor into the discussion.

Unfortunately all I can provide in response is more anecdotal and
opinion-based, but, nonetheless, here's how I would counter that:

First, people are lazy, and programmers are people. Seeing a lot of
non-non-enumerable class methods is, IMO, more indicative of the path of
least resistance, not an indicator of calculated, intended behavior.

Second, to quote Kevin from earlier,

If we want to preserve any kind of conceptual integrity for enumerability,
 then enumerability must indicate that the property is a data element within
 a data structure.


A thousand times, this. Properties are state, methods are behavior; this is
just OOP 101 (right?). And I don't see any compelling arguments being made
for enumerating the behavior of an object.

I hate relying on anecdotes, but for all the times I've used ES5-style
classes, I have always ended up creating enumerable methods simply
because that's the default behavior. I have never, *ever*, done this as a
design decision, and I'd wager (since I have the luxury of no data to prove
or disprove this) that that's a majority position.

On Wed, Dec 24, 2014 at 4:56 PM, Rick Waldron waldron.r...@gmail.com
wrote:



 On Wed Dec 24 2014 at 4:49:36 PM Kevin Smith zenpars...@gmail.com wrote:

 Here is the summary:
 Total Files Read:  11038
 Files Containing Explicit 'enumerable: false':  149
 Occurrences of 'enumerable: false' (and variants): 206


 I love this kind of analysis - thanks!


 I was actually inspired by a similar report you created for the list in
 the past.



 My interpretation of this data is that non-enumerability isn't important
 enough to bother with in the vast majority of cases.


 Yes, this was my interpretation as well.


 It *may* still be that non-enumerability is the least-surprise option for
 class methods, but certainly users don't care enough about the issue
 currently to bother with typing in enumerable: false.

 I'm still concerned about the refactoring hazard argument.  I think the
 idea is that if I change some ES5-style class into an ES6-style class, then
 I need to have good unit tests already in place to make sure that
 non-enumerability won't break things.  Otherwise, I can't do the refactor.


 Agreed: this has also been my main argument when the subject has come up
 in the past.

 Rick

 ___
 es-discuss mailing list
 es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss




-- 
Jeremy Martin
661.312.3853
http://devsmash.com
@jmar777
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Kevin Smith wrote:


Here is the summary:
Total Files Read:  11038
Files Containing Explicit 'enumerable: false':  149
Occurrences of 'enumerable: false' (and variants): 206


I love this kind of analysis - thanks!


Agreed, 3 -- thanks, Rick!

My interpretation of this data is that non-enumerability isn't 
important enough to bother with in the vast majority of cases.


There's a confounding variable: the pain of ES6s meta-object APIs, in 
all respects.


It's probably true that enumerability doesn't matter enough for many 
programmers, but the ES5 MOP is painful enough (both its intrinsic 
complexity and ES5's indirect costs, e.g., needing to shim into 
ES3-level engines) that it does not seem prudent to assume only one 
cause, or to assume which cause is proximate vs. distal.


For those who care about prototype method enumerability, however many 
they may be, if too few pass the ES5 hurdle (for whatever reason), then 
the measurements Rick took, while informative, are not decisive.


  It *may* still be that non-enumerability is the least-surprise 
option for class methods, but certainly users don't care enough about 
the issue currently to bother with typing in enumerable: false.


This came up on the twitter thread. If we pick a painful default, people 
will still probably migrate to the shortest-path-to-joy, arguably class 
syntax. In this light we can hope not to do too much harm, either way.


But what's best? I'd like to think it's non-enumerability, based on 
built-ins combined with for-in from the old days. I made built-in 
methods non-enumerable because that made for-in much more useful, 
compared to design alternatives (built-in prototype methods enumerable; 
no such thing as non-enumerable). It may be that even early JS didn't 
have enough time to experiment and find an even better way, e.g., 
explicit shallow vs. deep enumeration. That adds more user-facing 
complexity in choice of looping forms.


I'm still concerned about the refactoring hazard argument.  I think 
the idea is that if I change some ES5-style class into an ES6-style 
class, then I need to have good unit tests already in place to make 
sure that non-enumerability won't break things.  Otherwise, I can't do 
the refactor.


What do we think about that one?


Yehuda made the point on twitter that enumerability matters for object 
literals passed to extend-ish methods, and object literals  class 
prototypes. There are many objects created from literals, some of which 
are used as arguments to extend. There are few class prototypes, the 
built-in ones already have non-enumerable methods, and ES6 classes are 
new enough that if non-enumerable wins on balance, there won't be a 
refactoring hazard to-do with extends.


Other for-in-based library code than extend could break, but would with 
a built-in class that otherwise resembled the new ES6-usercode one. So 
the design of class obligations must include choosing and coding some 
enumerability non-default annotation or extra API boilerplate. Since 
non-default, it will be less common, possibly rare. So back to the 
what's the best long-term default question we cannot duck right now.


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Brendan Eich wrote:
There's a confounding variable: the pain of ES6s meta-object APIs, in 
all respects. 


I meant ES5's here, of course.

Agree with Jeremy, laziness is a programmer virtue and a part of human 
nature. People are not bothering where they don't know better, or do 
perhaps know enough but don't have time and cause to take the trouble. 
The trouble is due to the non-default nature of non-enumerability. 
Arguing from that past default to (still-future for a little while!) ES6 
class's prototype methods being non-enumerable is circular, if you 
ignore the foolish-consistency argument (which I think we should, but 
Im not dismissing here -- just noting that it isn't enough to avoid 
circularity because of the ES5's-painful-to-use confounder).


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Caitlin Potter
Supposing that methods were non-enumerable by default, would accessors be 
different, or also non-enumerable by default?

In most cases, accessors would make sense to be enumerable, e.g. for JSON 
serialization, but that would be sort of inconsistent and confusing if the 
default were different from methods

(Just thinking out loud)

 On Dec 24, 2014, at 7:09 PM, Brendan Eich bren...@mozilla.org wrote:
 
 Brendan Eich wrote:
 There's a confounding variable: the pain of ES6s meta-object APIs, in all 
 respects.
 
 I meant ES5's here, of course.
 
 Agree with Jeremy, laziness is a programmer virtue and a part of human 
 nature. People are not bothering where they don't know better, or do perhaps 
 know enough but don't have time and cause to take the trouble. The trouble is 
 due to the non-default nature of non-enumerability. Arguing from that past 
 default to (still-future for a little while!) ES6 class's prototype methods 
 being non-enumerable is circular, if you ignore the foolish-consistency 
 argument (which I think we should, but Im not dismissing here -- just noting 
 that it isn't enough to avoid circularity because of the ES5's-painful-to-use 
 confounder).
 
 /be
 ___
 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


Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Caitlin Potter wrote:

Supposing that methods were non-enumerable by default, would accessors be 
different, or also non-enumerable by default?


Non-enumerable, to match built-ins (RegExp.prototype has some notable 
accessors).


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Andrea Giammarchi
I'm sorry Rick, that's a great analysis but this is also how I see it,
metaphorically speaking:

most cars in the world use wheels 'cause we don't know better and that's
how it always worked

To be more explicit, here things I would have exepceted anyway:

Find out that developers tried to make things work down to ES3 and IE = 8
engines

Finding that developers didn't have native way to create classes before so
they used known ES3 patterns

Finding that old ES3 based class like architectures never bothered about
enumerablility since JSLint does not even accept for/in without a
hasOwnProperty check, these same libraries never bothered about getters and
setters inheritance too though (most of them)

Find out that Mr. D talked about enumerability as one of the bad part
people got used to but new comers will always smash their code against

Find out that someone actually bothered about this, in order to have
cleaner intent and expectations, without basing the code over ES3 and
understanding and using ES5 at its best ... these probably understand
getters and setters too, everyone else should be left out of the equation,
IMO

I'd also count how many `hasOwnProperty` checks are out there in the wild
because of all previous historical facts ... and re-read the analysis
since, as others said already, are we considering the way the past forced
to write things instead of considering the way developers would like things
to be?

Back to my first question: why would you ever want a method in a class be
enumerable?

Hope you got my point, thanks in any case for providing more data to think
about.

Cheers


P.S. this is mostly off topic but I find absolutely hilarious that Custom
Elements and document.resgisterElement accept a prototype property that
needs an object created through Object.create and a descriptor that for
lazyness will make ewverything non enumerable and actually even non
configurable and non writable ...

```js

var MyElement = document.registerElement(
  'my-element',
  {
prototype: Object.create(
  HTMLElement.prototype, {
  myCallback: {value: function() {
  }

```

going this direction we'll have in the near future custom elements with
nothing enumerable, opposite to current Web IDL standard, and JS user
classes and subclasses with everything enumerable, opposite to JS native
classes ... can I call sheganigans here ? :-)




On Wed, Dec 24, 2014 at 10:27 PM, Rick Waldron waldron.r...@gmail.com
wrote:

 Inline

 On Tue Dec 23 2014 at 10:24:06 PM Brendan Eich bren...@mozilla.org
 wrote:

 It ain't over till it's over. If we can't tweak ES6 to fix a mistake,
 just because process, then we're doing it wrong. OTOH the bar for any
 change, including what is regarded by many (but not all) as a fix, is
 very high.

 We should take advantage of es-discuss to debate the crucial question,
 which is not whether enumerable prototype methods are the rule or
 exception -- as Rick said, for built-ins (but not all DOM methods),
 non-enumerable is the common case; for user-defined classes prior to ES5
 and Object.defineProperty, enumerable is the norm.

 This is true in the rule/exceptions/confusion sense we all know and hate.


 The question is: what should ES6 classes choose as the default? What's
 the most useful default, independent of various backward-looking
 consistencies? What, if the future is bigger than the past, would be best?


 Put in these terms, I still think that maintaining status quo makes sense.
 The future _is_ bigger than the past and this can be addressed via
 annotations (maybe even in ES7?).

 It seems worthwhile to mention non-enumerability has its own problems:
 recall that Array.prototype.contains was recently renamed to
 Array.prototype.includes exactly because the built-in is non-enumerable by
 default. It could've been argued that this was a good reason to break with
 that norm and make built-ins enumerable by default. That of course is a
 non-starter—so why is breaking enumerable by default for user defined
 classes under consideration?

 Non-enumerability can still be achieved, it's not pretty (it downright
 sucks), but most user code simply doesn't go out of its way to explicitly
 define properties as non-enumerable:

 - Compiled a list of 600 modules that npm shows as the most depended on (
 https://www.npmjs.com/browse/depended, pages 1-10).
 - I created a script that installed all 600 modules
 - Confirmed installation by attempting to require all of them. Three
 created issues when require'ing, but otherwise all modules loaded
 (typescript, fstream-ignore, fis-parser-less)
 - Globbing node_modules/**/*.js produced 35371 files, so do a naive
 filter for paths with test in it (assume this just a test file, whether
 that's correct or not, as we'll see: it doesn't matter). Also only look at
 a file once by tracking the actual module file path and not the complete
 path. This brings the number down to 11038 files.
 - Read the source of each file, line by line, counting

Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Boris Zbarsky wrote:
3)  Try to make all DOM stuff non-enumerable, dealing with compat 
issues by adding [LegacyEnumerableProperties] in the few cases where 
they arise.  This risks landing us in the same place as #2 depending 
on how many interfaces need the annotation, plus compat fallout as we 
discover which interfaces need it.  But it would maybe get us to the 
point where we don't have the Conway's Law problems, and it may well 
turn out that very few interfaces need the 
[LegacyEnumerableProperties] thing.


We aren't going to reverse-Conway the core language built-ins to have 
enumerable methods, ever -- so I think the right attack is on the quirky 
DOM. As usual :-P.


(I'm to blame for some of these quirks, IIRC -- but I don't have 
Netscape 2 or 3 code around. So, I'm to blame for everything. As usual :-|.)


Are there some DOM prototype methods/accessors that are non-enumerable? 
Sorry for the dear-lazy-bz mail.


If I were doing green-field implementation of the DOM, of course, 
option 3 it would be, to match ES builtins


Yup. This should weigh on us.

Apart from all that, we've generally been aiming at converging Web IDL 
behavior on the behavior of ES6 classes as much as we can, and 
continue to do so.  So if classes end up with stuff non-enumerable by 
default that would militate in favor of option 3 above.  Which is 
great except for the possible compat fallout.  I'm game for trying it, 
though, if other UAs are. 


Hope to hear from bterlson and someone on chromium/Blink DOM/WebIDL duty.

/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Axel Rauschmayer wrote:
The alternative is to treat enumerability the way ES6 treats holes: 
pretend it doesn’t exist:


That doesn't work, here or for holes. We've actually split APIs with 
respect to holes, and this will mean bugs. We did make an intentional 
future-trumps-past choice against holes, though.


Here and on twitter, we seem to have members of the committee on both 
sides. Not good. Not saying consensus is broken and dissenters from the 
draft status will throw their bodies in front of the train, but it's 
worth extended discussion and (thanks again, Rick) measurement of what 
can be measured.


* Use `Reflect.ownKeys`, `Object.getOwnPropertyNames`, 
`Object.getOwnPropertySymbols` instead of `Object.keys`.

* Don’t use the `for-in` loop (an easy one…)
* Change `Object.assign` so that it considers all properties, not just 
enumerable ones.

* The properties of class prototypes remain non-enumerable.
* I’m unsure about new built-in instance prototypes. For consistency’s 
sake, one may want to make them non-enumerable. But how would they be 
different from a library?


Quoting Sebastian Markbåge: 
https://twitter.com/sebmarkbage/status/547156703104753664


 enumerable is just one of an infinite number of categories you 
might want to filter on. It's a hack and should die.


Would this approach have any disadvantages?


The prescriptionist approach has not worked. See the Auburn study that 
Allen cited:


http://munawarhafiz.com/research/jssurvey/GHB14-JSUsedParts.pdf

People use for-in without hasOwnProperty -- a lot. Some intentionally 
well-used cases, no doubt -- others accidents waiting to happen.


JS has some bad defaults, requiring long-winded workarounds. Lazy 
programmers will inevitably skip the workarounds. Let's not do another.


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Andrea Giammarchi
Out of curiosity, which accessor, being a runtime info that once trapped in
a static property looses its meaning, is commonly needed for JSON ?

I am just thinking about `Array` and the fact that thanks gosh the `length`
is not in. What kind of logic you have in mind?

```js
// to fix the exception
// with ... a **non enumerable** method ;-)
class SomeCase {
  toJSON() {
var o = Object.assign({}, this);
o.accessor = this.accessor;
return o;
  }
}
```

case solved in few lines and yet another method, the `toJSON` one, that
nobody wants to show up anywhere in an enumerable way.

Best Regards



On Thu, Dec 25, 2014 at 1:17 AM, Caitlin Potter caitpotte...@gmail.com
wrote:

 Supposing that methods were non-enumerable by default, would accessors be
 different, or also non-enumerable by default?

 In most cases, accessors would make sense to be enumerable, e.g. for JSON
 serialization, but that would be sort of inconsistent and confusing if the
 default were different from methods

 (Just thinking out loud)

  On Dec 24, 2014, at 7:09 PM, Brendan Eich bren...@mozilla.org wrote:
 
  Brendan Eich wrote:
  There's a confounding variable: the pain of ES6s meta-object APIs, in
 all respects.
 
  I meant ES5's here, of course.
 
  Agree with Jeremy, laziness is a programmer virtue and a part of human
 nature. People are not bothering where they don't know better, or do
 perhaps know enough but don't have time and cause to take the trouble. The
 trouble is due to the non-default nature of non-enumerability. Arguing from
 that past default to (still-future for a little while!) ES6 class's
 prototype methods being non-enumerable is circular, if you ignore the
 foolish-consistency argument (which I think we should, but Im not
 dismissing here -- just noting that it isn't enough to avoid circularity
 because of the ES5's-painful-to-use confounder).
 
  /be
  ___
  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


Re: classes and enumerability

2014-12-24 Thread Brendan Eich
Sorry, you can't use small-world reasoning about programming in the 
large, especially with JS on the web. for-in proliferated, before 
hasOwnProperty appeared in ES3. Even after, the burden was high enough, 
per that study Allen cited 
(http://munawarhafiz.com/research/jssurvey/GHB14-JSUsedParts.pdf). 
for-in ain't going away.


If you are saying we should make class prototype methods non-enumerable 
in ES6, I agree. If you're saying it won't matter that they remain as 
drafted, enumerable, because everyone will stop using for-in. I don't 
buy it. If you are suggesting that for-in-based code won't be run on 
class prototypes, perhaps -- but that's a gamble.


/be

Gary Guo wrote:
Actually I believe that there will not be many cases that we need to 
use for-in loop in ES6. In most cases enumerate through properties in 
the prototype chain is not preferable. for-of Object.keys should be 
enough for enumeration with own properties. If my assumption is 
correct, since we are less likely to use legacy ways, we will be more 
able to make a change. 

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Caitlin Potter
An assessor can produce data which is desired serialization, period. For 
instance, a setter might be used to enforce rules on valid values, which should 
still be serialized. A proxy could do this too, but nobody really wants to use 
proxies for everything.

On the other hand, certain assessor properties you would definitely not want to 
serialize, to avoid providing sensitive, unnecessary, or circular data to a 
serializer. So it's hard to pick the most sensible default. 

I don't think built in accessors really matter much, because things like Array 
length becomes useless when serialized, but user defined accessors often aren't 
useless or undesirable to serialize (at least in data persistence libraries and 
similar things).

It's hard to produce a cohesive argument or example from a phone, though, I'll 
get back to this on another day.

 On Dec 24, 2014, at 7:47 PM, Andrea Giammarchi andrea.giammar...@gmail.com 
 wrote:
 
 Out of curiosity, which accessor, being a runtime info that once trapped in a 
 static property looses its meaning, is commonly needed for JSON ?
 
 I am just thinking about `Array` and the fact that thanks gosh the `length` 
 is not in. What kind of logic you have in mind?
 
 ```js
 // to fix the exception
 // with ... a **non enumerable** method ;-)
 class SomeCase {
   toJSON() {
 var o = Object.assign({}, this);
 o.accessor = this.accessor;
 return o;
   }
 }
 ```
 
 case solved in few lines and yet another method, the `toJSON` one, that 
 nobody wants to show up anywhere in an enumerable way.
 
 Best Regards
 
 
 
 On Thu, Dec 25, 2014 at 1:17 AM, Caitlin Potter caitpotte...@gmail.com 
 wrote:
 Supposing that methods were non-enumerable by default, would accessors be 
 different, or also non-enumerable by default?
 
 In most cases, accessors would make sense to be enumerable, e.g. for JSON 
 serialization, but that would be sort of inconsistent and confusing if the 
 default were different from methods
 
 (Just thinking out loud)
 
  On Dec 24, 2014, at 7:09 PM, Brendan Eich bren...@mozilla.org wrote:
 
  Brendan Eich wrote:
  There's a confounding variable: the pain of ES6s meta-object APIs, in all 
  respects.
 
  I meant ES5's here, of course.
 
  Agree with Jeremy, laziness is a programmer virtue and a part of human 
  nature. People are not bothering where they don't know better, or do 
  perhaps know enough but don't have time and cause to take the trouble. The 
  trouble is due to the non-default nature of non-enumerability. Arguing 
  from that past default to (still-future for a little while!) ES6 class's 
  prototype methods being non-enumerable is circular, if you ignore the 
  foolish-consistency argument (which I think we should, but Im not 
  dismissing here -- just noting that it isn't enough to avoid circularity 
  because of the ES5's-painful-to-use confounder).
 
  /be
  ___
  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


Re: classes and enumerability

2014-12-24 Thread Andrea Giammarchi
I'm sure there are cases, that's why I've written a possible solution that
is quite straight forward for those cases, but I am still curious to see a
concerete example. In other PL, when you serialize in order to deserialize
in a 1:1 way, you never have getters/setters in, just the properties that
will make again those getters/setters meaningful.

However, to just pass data around, I see if that accessor contains a
sensible info, of course you want it in.

I wonder if this is really the most common case though ... and if we should
make the enumerability desired as such most common case.

We could have the ability to chose instead and use old patterns when
needed, through all object literals improvements and over prototype
assignment ... but, can we have something better and more suitable for
classes wiith the new ES6 class sugar?

Going all enumerable is not future friendly, rather past friendly, and
the whole idea of ES.next is to have the past still compatible within new
syntax.
Why carrying old gotchas in is not a good way to clean-up or go toward
better patterns.

Cheers


On Thu, Dec 25, 2014 at 2:24 AM, Caitlin Potter caitpotte...@gmail.com
wrote:

 An assessor can produce data which is desired serialization, period. For
 instance, a setter might be used to enforce rules on valid values, which
 should still be serialized. A proxy could do this too, but nobody really
 wants to use proxies for everything.

 On the other hand, certain assessor properties you would definitely not
 want to serialize, to avoid providing sensitive, unnecessary, or circular
 data to a serializer. So it's hard to pick the most sensible default.

 I don't think built in accessors really matter much, because things like
 Array length becomes useless when serialized, but user defined accessors
 often aren't useless or undesirable to serialize (at least in data
 persistence libraries and similar things).

 It's hard to produce a cohesive argument or example from a phone, though,
 I'll get back to this on another day.

 On Dec 24, 2014, at 7:47 PM, Andrea Giammarchi 
 andrea.giammar...@gmail.com wrote:

 Out of curiosity, which accessor, being a runtime info that once trapped
 in a static property looses its meaning, is commonly needed for JSON ?

 I am just thinking about `Array` and the fact that thanks gosh the
 `length` is not in. What kind of logic you have in mind?

 ```js
 // to fix the exception
 // with ... a **non enumerable** method ;-)
 class SomeCase {
   toJSON() {
 var o = Object.assign({}, this);
 o.accessor = this.accessor;
 return o;
   }
 }
 ```

 case solved in few lines and yet another method, the `toJSON` one, that
 nobody wants to show up anywhere in an enumerable way.

 Best Regards



 On Thu, Dec 25, 2014 at 1:17 AM, Caitlin Potter caitpotte...@gmail.com
 wrote:

 Supposing that methods were non-enumerable by default, would accessors be
 different, or also non-enumerable by default?

 In most cases, accessors would make sense to be enumerable, e.g. for JSON
 serialization, but that would be sort of inconsistent and confusing if the
 default were different from methods

 (Just thinking out loud)

  On Dec 24, 2014, at 7:09 PM, Brendan Eich bren...@mozilla.org wrote:
 
  Brendan Eich wrote:
  There's a confounding variable: the pain of ES6s meta-object APIs, in
 all respects.
 
  I meant ES5's here, of course.
 
  Agree with Jeremy, laziness is a programmer virtue and a part of human
 nature. People are not bothering where they don't know better, or do
 perhaps know enough but don't have time and cause to take the trouble. The
 trouble is due to the non-default nature of non-enumerability. Arguing from
 that past default to (still-future for a little while!) ES6 class's
 prototype methods being non-enumerable is circular, if you ignore the
 foolish-consistency argument (which I think we should, but Im not
 dismissing here -- just noting that it isn't enough to avoid circularity
 because of the ES5's-painful-to-use confounder).
 
  /be
  ___
  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


Re: classes and enumerability

2014-12-24 Thread Andrea Giammarchi
also apologies, generally speaking, I haven't found a way yet to configure
this bloody spellcheck in Epiphany for GNOME 3.14 ... I might park myself
until I can write without 3 mistakes per 5 written chars.

Best Regards

On Thu, Dec 25, 2014 at 2:36 AM, Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 I'm sure there are cases, that's why I've written a possible solution that
 is quite straight forward for those cases, but I am still curious to see a
 concerete example. In other PL, when you serialize in order to deserialize
 in a 1:1 way, you never have getters/setters in, just the properties that
 will make again those getters/setters meaningful.

 However, to just pass data around, I see if that accessor contains a
 sensible info, of course you want it in.

 I wonder if this is really the most common case though ... and if we
 should make the enumerability desired as such most common case.

 We could have the ability to chose instead and use old patterns when
 needed, through all object literals improvements and over prototype
 assignment ... but, can we have something better and more suitable for
 classes wiith the new ES6 class sugar?

 Going all enumerable is not future friendly, rather past friendly, and
 the whole idea of ES.next is to have the past still compatible within new
 syntax.
 Why carrying old gotchas in is not a good way to clean-up or go toward
 better patterns.

 Cheers


 On Thu, Dec 25, 2014 at 2:24 AM, Caitlin Potter caitpotte...@gmail.com
 wrote:

 An assessor can produce data which is desired serialization, period. For
 instance, a setter might be used to enforce rules on valid values, which
 should still be serialized. A proxy could do this too, but nobody really
 wants to use proxies for everything.

 On the other hand, certain assessor properties you would definitely not
 want to serialize, to avoid providing sensitive, unnecessary, or circular
 data to a serializer. So it's hard to pick the most sensible default.

 I don't think built in accessors really matter much, because things like
 Array length becomes useless when serialized, but user defined accessors
 often aren't useless or undesirable to serialize (at least in data
 persistence libraries and similar things).

 It's hard to produce a cohesive argument or example from a phone, though,
 I'll get back to this on another day.

 On Dec 24, 2014, at 7:47 PM, Andrea Giammarchi 
 andrea.giammar...@gmail.com wrote:

 Out of curiosity, which accessor, being a runtime info that once trapped
 in a static property looses its meaning, is commonly needed for JSON ?

 I am just thinking about `Array` and the fact that thanks gosh the
 `length` is not in. What kind of logic you have in mind?

 ```js
 // to fix the exception
 // with ... a **non enumerable** method ;-)
 class SomeCase {
   toJSON() {
 var o = Object.assign({}, this);
 o.accessor = this.accessor;
 return o;
   }
 }
 ```

 case solved in few lines and yet another method, the `toJSON` one, that
 nobody wants to show up anywhere in an enumerable way.

 Best Regards



 On Thu, Dec 25, 2014 at 1:17 AM, Caitlin Potter caitpotte...@gmail.com
 wrote:

 Supposing that methods were non-enumerable by default, would accessors
 be different, or also non-enumerable by default?

 In most cases, accessors would make sense to be enumerable, e.g. for
 JSON serialization, but that would be sort of inconsistent and confusing if
 the default were different from methods

 (Just thinking out loud)

  On Dec 24, 2014, at 7:09 PM, Brendan Eich bren...@mozilla.org wrote:
 
  Brendan Eich wrote:
  There's a confounding variable: the pain of ES6s meta-object APIs, in
 all respects.
 
  I meant ES5's here, of course.
 
  Agree with Jeremy, laziness is a programmer virtue and a part of human
 nature. People are not bothering where they don't know better, or do
 perhaps know enough but don't have time and cause to take the trouble. The
 trouble is due to the non-default nature of non-enumerability. Arguing from
 that past default to (still-future for a little while!) ES6 class's
 prototype methods being non-enumerable is circular, if you ignore the
 foolish-consistency argument (which I think we should, but Im not
 dismissing here -- just noting that it isn't enough to avoid circularity
 because of the ES5's-painful-to-use confounder).
 
  /be
  ___
  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


Re: classes and enumerability

2014-12-24 Thread Glen Huang
Just my 2 cents:

1. Rick’s field test approach is epic. Encourage me to get my hands dirty. :)

   However, the conclusion I get from these tests is that not many developers 
explicitly set things to be non-enumerable. This does not directly translate to 
“many developers care about prototype properties being enumerable”.

   I agree with Andrea here that `hasOwnProperty` has to be taken into 
consideration. Especially whether people use `hasOwnProperty` inside “for in”. 
Because that’s what enumerability of class syntax will eventually affect. 
Nothing else matters if I’m not wrong. (This seems to also be Allen’s opinion)

2. Allen’s study addressed exactly that.

   Especially the ENUMERATION WITH FOR…IN” chapter. And again, epic. :)

   The conclusion in the study is that not many people use “hasOwnProperty” 
with “for in”. However, one thing I think is still missing is to examine that 
what kinds of objects are being used with “for in”. For example, if this is how 
they use “for in”:

```
var defaults = { … };
for (var key in defaults) { … }
```

or

```
var defaults = { … };
var options = Object.create(defaults);
for (var key in options) { … }
```

Then it should be totally fine if they don’t use “hasOwnProperty” and they 
don’t adding things to Object.prototype. (I think whether they (or the libs 
they use) add properties to Object.prototype should also be examined in this 
case).

Also “for in” over DOM objects should also be examined. Because enumerability 
of class syntax doesn’t matter here even if they don’t use “hasOwnProperty”.

So it pretty much comes down to this:

Do many developers use “for in” over objects created by user created 
constructors and don’t use “hasOwnProperty” when they do that.

If the answer is “yes”, then default class syntax to non-enum is probably not a 
good idea. Otherwise, it should be fine.

I will do some tests to see if I can answer that question with some concrete 
data. (probably is going to take some time, I don’t see reliable way of testing 
that right now). 

 On Dec 25, 2014, at 8:56 AM, Brendan Eich bren...@mozilla.org wrote:
 
 Sorry, you can't use small-world reasoning about programming in the large, 
 especially with JS on the web. for-in proliferated, before hasOwnProperty 
 appeared in ES3. Even after, the burden was high enough, per that study Allen 
 cited (http://munawarhafiz.com/research/jssurvey/GHB14-JSUsedParts.pdf). 
 for-in ain't going away.
 
 If you are saying we should make class prototype methods non-enumerable in 
 ES6, I agree. If you're saying it won't matter that they remain as drafted, 
 enumerable, because everyone will stop using for-in. I don't buy it. If you 
 are suggesting that for-in-based code won't be run on class prototypes, 
 perhaps -- but that's a gamble.
 
 /be
 
 Gary Guo wrote:
 Actually I believe that there will not be many cases that we need to use 
 for-in loop in ES6. In most cases enumerate through properties in the 
 prototype chain is not preferable. for-of Object.keys should be enough for 
 enumeration with own properties. If my assumption is correct, since we are 
 less likely to use legacy ways, we will be more able to make a change. 
 ___
 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


Re: classes and enumerability

2014-12-24 Thread Rick Waldron
To be clear, the only conclusion to be drawn from my exercise was that
there isn't a broad pain being felt by all developers all the time, going
out of their way to explicitly define non-enumerable properties. My
motivation always begins at: how to evolve the language based on the most
common developer patterns. In the absence of a compelling hardship, I don't
see the benefit of changing the default definition semantics—but—as I my
own understanding evolves, I think I'm in agreement with Brendan and Yehuda
(and whoever else) that: enumerable in obj lit, non-enumerable in class
body is reasonable path forward.

Rick
On Wed, Dec 24, 2014 at 9:21 PM Glen Huang curvedm...@gmail.com wrote:

 Just my 2 cents:

 1. Rick’s field test approach is epic. Encourage me to get my hands dirty.
 :)

However, the conclusion I get from these tests is that not many
 developers explicitly set things to be non-enumerable. This does not
 directly translate to “many developers care about prototype properties
 being enumerable”.

I agree with Andrea here that `hasOwnProperty` has to be taken into
 consideration. Especially whether people use `hasOwnProperty` inside “for
 in”. Because that’s what enumerability of class syntax will eventually
 affect. Nothing else matters if I’m not wrong. (This seems to also be
 Allen’s opinion)

 2. Allen’s study addressed exactly that.

Especially the ENUMERATION WITH FOR…IN” chapter. And again, epic. :)

The conclusion in the study is that not many people use
 “hasOwnProperty” with “for in”. However, one thing I think is still missing
 is to examine that what kinds of objects are being used with “for in”. For
 example, if this is how they use “for in”:

 ```
 var defaults = { … };
 for (var key in defaults) { … }
 ```

 or

 ```
 var defaults = { … };
 var options = Object.create(defaults);
 for (var key in options) { … }
 ```

 Then it should be totally fine if they don’t use “hasOwnProperty” and they
 don’t adding things to Object.prototype. (I think whether they (or the libs
 they use) add properties to Object.prototype should also be examined in
 this case).

 Also “for in” over DOM objects should also be examined. Because
 enumerability of class syntax doesn’t matter here even if they don’t use
 “hasOwnProperty”.

 So it pretty much comes down to this:

 Do many developers use “for in” over objects created by user created
 constructors and don’t use “hasOwnProperty” when they do that.

 If the answer is “yes”, then default class syntax to non-enum is probably
 not a good idea. Otherwise, it should be fine.

 I will do some tests to see if I can answer that question with some
 concrete data. (probably is going to take some time, I don’t see reliable
 way of testing that right now).

  On Dec 25, 2014, at 8:56 AM, Brendan Eich bren...@mozilla.org wrote:
 
  Sorry, you can't use small-world reasoning about programming in the
 large, especially with JS on the web. for-in proliferated, before
 hasOwnProperty appeared in ES3. Even after, the burden was high enough, per
 that study Allen cited (http://munawarhafiz.com/research/jssurvey/GHB14-
 JSUsedParts.pdf). for-in ain't going away.
 
  If you are saying we should make class prototype methods non-enumerable
 in ES6, I agree. If you're saying it won't matter that they remain as
 drafted, enumerable, because everyone will stop using for-in. I don't buy
 it. If you are suggesting that for-in-based code won't be run on class
 prototypes, perhaps -- but that's a gamble.
 
  /be
 
  Gary Guo wrote:
  Actually I believe that there will not be many cases that we need to
 use for-in loop in ES6. In most cases enumerate through properties in the
 prototype chain is not preferable. for-of Object.keys should be enough for
 enumeration with own properties. If my assumption is correct, since we are
 less likely to use legacy ways, we will be more able to make a change.
  ___
  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


Re: classes and enumerability

2014-12-24 Thread Axel Rauschmayer
Got it, thanks!

 On 25 Dec 2014, at 01:26, Brendan Eich bren...@mozilla.org wrote:
 
 Axel Rauschmayer wrote:
 The alternative is to treat enumerability the way ES6 treats holes: pretend 
 it doesn’t exist:
 
 That doesn't work, here or for holes. We've actually split APIs with respect 
 to holes, and this will mean bugs. We did make an intentional 
 future-trumps-past choice against holes, though.
 
 Here and on twitter, we seem to have members of the committee on both sides. 
 Not good. Not saying consensus is broken and dissenters from the draft status 
 will throw their bodies in front of the train, but it's worth extended 
 discussion and (thanks again, Rick) measurement of what can be measured.
 
 * Use `Reflect.ownKeys`, `Object.getOwnPropertyNames`, 
 `Object.getOwnPropertySymbols` instead of `Object.keys`.
 * Don’t use the `for-in` loop (an easy one…)
 * Change `Object.assign` so that it considers all properties, not just 
 enumerable ones.
 * The properties of class prototypes remain non-enumerable.
 * I’m unsure about new built-in instance prototypes. For consistency’s sake, 
 one may want to make them non-enumerable. But how would they be different 
 from a library?
 
 Quoting Sebastian Markbåge: 
 https://twitter.com/sebmarkbage/status/547156703104753664
 
  enumerable is just one of an infinite number of categories you might 
  want to filter on. It's a hack and should die.
 
 Would this approach have any disadvantages?
 
 The prescriptionist approach has not worked. See the Auburn study that Allen 
 cited:
 
 http://munawarhafiz.com/research/jssurvey/GHB14-JSUsedParts.pdf
 
 People use for-in without hasOwnProperty -- a lot. Some intentionally 
 well-used cases, no doubt -- others accidents waiting to happen.
 
 JS has some bad defaults, requiring long-winded workarounds. Lazy programmers 
 will inevitably skip the workarounds. Let's not do another.
 
 /be

-- 
Dr. Axel Rauschmayer
a...@rauschma.de
rauschma.de



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Glen Huang
Sorry I got your intention wrong and glad your agreed. :)

 On Dec 25, 2014, at 10:39 AM, Rick Waldron waldron.r...@gmail.com wrote:
 
 To be clear, the only conclusion to be drawn from my exercise was that there 
 isn't a broad pain being felt by all developers all the time, going out of 
 their way to explicitly define non-enumerable properties. My motivation 
 always begins at: how to evolve the language based on the most common 
 developer patterns. In the absence of a compelling hardship, I don't see the 
 benefit of changing the default definition semantics—but—as I my own 
 understanding evolves, I think I'm in agreement with Brendan and Yehuda (and 
 whoever else) that: enumerable in obj lit, non-enumerable in class body is 
 reasonable path forward. 
 
 Rick
 On Wed, Dec 24, 2014 at 9:21 PM Glen Huang curvedm...@gmail.com 
 mailto:curvedm...@gmail.com wrote:
 Just my 2 cents:
 
 1. Rick’s field test approach is epic. Encourage me to get my hands dirty. :)
 
However, the conclusion I get from these tests is that not many developers 
 explicitly set things to be non-enumerable. This does not directly translate 
 to “many developers care about prototype properties being enumerable”.
 
I agree with Andrea here that `hasOwnProperty` has to be taken into 
 consideration. Especially whether people use `hasOwnProperty` inside “for 
 in”. Because that’s what enumerability of class syntax will eventually 
 affect. Nothing else matters if I’m not wrong. (This seems to also be Allen’s 
 opinion)
 
 2. Allen’s study addressed exactly that.
 
Especially the ENUMERATION WITH FOR…IN” chapter. And again, epic. :)
 
The conclusion in the study is that not many people use “hasOwnProperty” 
 with “for in”. However, one thing I think is still missing is to examine that 
 what kinds of objects are being used with “for in”. For example, if this is 
 how they use “for in”:
 
 ```
 var defaults = { … };
 for (var key in defaults) { … }
 ```
 
 or
 
 ```
 var defaults = { … };
 var options = Object.create(defaults);
 for (var key in options) { … }
 ```
 
 Then it should be totally fine if they don’t use “hasOwnProperty” and they 
 don’t adding things to Object.prototype. (I think whether they (or the libs 
 they use) add properties to Object.prototype should also be examined in this 
 case).
 
 Also “for in” over DOM objects should also be examined. Because enumerability 
 of class syntax doesn’t matter here even if they don’t use “hasOwnProperty”.
 
 So it pretty much comes down to this:
 
 Do many developers use “for in” over objects created by user created 
 constructors and don’t use “hasOwnProperty” when they do that.
 
 If the answer is “yes”, then default class syntax to non-enum is probably not 
 a good idea. Otherwise, it should be fine.
 
 I will do some tests to see if I can answer that question with some concrete 
 data. (probably is going to take some time, I don’t see reliable way of 
 testing that right now).
 
  On Dec 25, 2014, at 8:56 AM, Brendan Eich bren...@mozilla.org 
  mailto:bren...@mozilla.org wrote:
 
  Sorry, you can't use small-world reasoning about programming in the large, 
  especially with JS on the web. for-in proliferated, before hasOwnProperty 
  appeared in ES3. Even after, the burden was high enough, per that study 
  Allen cited 
  (http://munawarhafiz.com/research/jssurvey/GHB14-JSUsedParts.pdf 
  http://munawarhafiz.com/research/jssurvey/GHB14-JSUsedParts.pdf). for-in 
  ain't going away.
 
  If you are saying we should make class prototype methods non-enumerable in 
  ES6, I agree. If you're saying it won't matter that they remain as drafted, 
  enumerable, because everyone will stop using for-in. I don't buy it. If you 
  are suggesting that for-in-based code won't be run on class prototypes, 
  perhaps -- but that's a gamble.
 
  /be
 
  Gary Guo wrote:
  Actually I believe that there will not be many cases that we need to use 
  for-in loop in ES6. In most cases enumerate through properties in the 
  prototype chain is not preferable. for-of Object.keys should be enough for 
  enumeration with own properties. If my assumption is correct, since we are 
  less likely to use legacy ways, we will be more able to make a change.
  ___
  es-discuss mailing list
  es-discuss@mozilla.org mailto:es-discuss@mozilla.org
  https://mail.mozilla.org/listinfo/es-discuss 
  https://mail.mozilla.org/listinfo/es-discuss
 
 ___
 es-discuss mailing list
 es-discuss@mozilla.org mailto:es-discuss@mozilla.org
 https://mail.mozilla.org/listinfo/es-discuss 
 https://mail.mozilla.org/listinfo/es-discuss

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Boris Zbarsky

On 12/24/14 4:22 PM, Brendan Eich wrote:

We aren't going to reverse-Conway the core language built-ins to have
enumerable methods, ever


Sure.  Note that this was not one of my three possible listed courses of 
action.



-- so I think the right attack is on the quirky DOM.


I think the fundamental assumption that the DOM is quirky is broken. 
The DOM is what it is.  It dates back on the web just as far as ES does. 
 It was largely implemented (certainly in terms of its ES bindings) by 
ES engine implementors.  The us vs them mentality I see so much of on 
this list is very discouraging, honestly.



Are there some DOM prototype methods/accessors that are non-enumerable?


Not in the Web IDL spec or in Gecko or IE as far as I know.

I believe toString on things like HTMLAnchorElement is not enumerable in 
Chrome and Safari.  See https://www.w3.org/Bugs/Public/show_bug.cgi?id=26179


I'm not aware of anything else in the DOM that's not enumerable.

-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Brendan Eich

Boris Zbarsky wrote:



-- so I think the right attack is on the quirky DOM.


I think the fundamental assumption that the DOM is quirky is broken.


Something is quirky if we want mostly-consistent non-enumerability of 
proto-methods/accessors. Either core built-ins, or DOM. Sorry if 
quirky sounds pejorative, in JS contexts its common enough that what 
I'm trying to get at is somewhere between unusual and exception-not-rule.


The DOM is what it is.  It dates back on the web just as far as ES 
does.  It was largely implemented (certainly in terms of its ES 
bindings) by ES engine implementors.


Hey, it's me, the JS perpetrator, here :-P. There was no ES when I 
made DOM level 0 (not called that till much later). It was all just JS 
(spelled out) then. As I noted last time (including how my memory may be 
failing me), *I'm* the idiot who made DOM proto-methods enumerable. I 
think it was mostly an accident; I don't remember a strong rationale.


Note that I did have a rationale for non-enumerability of built-in class 
proto-methods: for-in utility maximization.


  The us vs them mentality I see so much of on this list is very 
discouraging, honestly.


I assure you I was not suffering from us v. them or multiple 
personalities back then! :-P


Seriously, the main problem over time has been W3C vs. Ecma, but I'm not 
blaming the standards bodies (only or mostly). It's a separation of 
concerns that mixed badly with Java heads, XML heads, and the IE 
monopoly. Bygones.


Back to the present: we have to pick a default setting. I think 
non-enumerability wins, as noted. Can we move forward?



Are there some DOM prototype methods/accessors that are non-enumerable?


Not in the Web IDL spec or in Gecko or IE as far as I know.

I believe toString on things like HTMLAnchorElement is not enumerable 
in Chrome and Safari.  See 
https://www.w3.org/Bugs/Public/show_bug.cgi?id=26179


I'm not aware of anything else in the DOM that's not enumerable.


Anyone have the jwz nostalgia releases of old browsers such as Netscape 
3? Would be fun to poke at some of the old (buggy, shuder) ur-DOM.


/be


-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Boris Zbarsky

On 12/24/14 9:34 PM, Brendan Eich wrote:

Something is quirky if we want mostly-consistent non-enumerability of
proto-methods/accessors. Either core built-ins, or DOM. Sorry if
quirky sounds pejorative


It sure does at least to me.


Hey, it's me, the JS perpetrator, here :-P.


Yes, I know.  ;)


I assure you I was not suffering from us v. them or multiple
personalities back then! :-P


Good.  :)


Seriously, the main problem over time has been W3C vs. Ecma, but I'm not
blaming the standards bodies (only or mostly). It's a separation of
concerns that mixed badly with Java heads, XML heads, and the IE
monopoly. Bygones.


Indeed.  I wish this was bygones, though...  Would love us to get there.


Back to the present: we have to pick a default setting. I think
non-enumerability wins, as noted.


That's my gut feeling too, esp. if we can de-Conway.


Anyone have the jwz nostalgia releases of old browsers such as Netscape
3?


If you'd asked this question 3 years ago, when I still had access to 
some Solaris workstations with all sorts of old stuff on them, I might 
have been able to do that for you.  Certainly Netscape 4.


That said, web searching suggests 
http://sillydog.org/narchive/full123.php might have these things.  I 
expect only the Windows versions are at all likely to be runnable on a 
modern system...


-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-24 Thread Boris Zbarsky

On 12/24/14 9:50 PM, Boris Zbarsky wrote:

That's my gut feeling too, esp. if we can de-Conway.


Also relevant here is 
https://www.w3.org/Bugs/Public/show_bug.cgi?id=27361 which never really 
got a response...  I wish the W3C bugzilla had the needinfo feature.


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


classes and enumerability

2014-12-23 Thread Andrea Giammarchi
Dear Santa,
  I wish since ES3 era that properties defined on a prototype are by
default **not** enumerable.

By any chance we can make this happen in ES6 classes?

Or better ... why would anyone expect or want them to be enumerable?

To define a `class` is a very explicit intent, I believe having those
definitions non enumerable would be a preferred option for majority of
developers that have been doomed in `for/in` since kinda ever before
enumerable was not configurable.

All default methods and properties in native prototypes are **not**
enumerable, why does it have to be so inconsistent with userland?

You also know ES6 is the only window we have 'cause after that it will be a
breaking change.

Thank you at least for any sort of extra/concrete clarification about this
choice.

Merry Christmas
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Boris Zbarsky

On 12/23/14 4:35 PM, Andrea Giammarchi wrote:

Or better ... why would anyone expect or want them to be enumerable?


This is a good question.  Note that there is web content that depends on 
the current setup wherein stuff on DOM prototypes is enumerable... you 
may want to check on why exactly they do that.


I agree that it would have been better all around if none of this stuff 
had been enumerable historically.  As things stand, ES builtins are 
non-enumerable, DOM builtins are enumerable, and someone designing an 
API and wanting to be consistent with the platform is screwed.


The situation is especially bad for things that start off in the DOM and 
then move into ES; for example right now Gecko and Blink are not 
interoperable on whether then is an enumerable property of 
Promise.prototype...



You also know ES6 is the only window we have 'cause after that it will
be a breaking change.


Pretty much anything here is a breaking change, sadly, no matter what we 
pick.  Certainly your proposed change is a breaking one if the intent is 
that Web IDL outputs ES classes...


-Boris

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Rick Waldron
On Tue Dec 23 2014 at 7:35:44 PM Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 Dear Santa,
   I wish since ES3 era that properties defined on a prototype are by
 default **not** enumerable.


 By any chance we can make this happen in ES6 classes?


ES6 is done, properties of user created prototypes are enumerable by
default. They can be made non-enumerable if you want them that way, but
doing so by default is inconsistent with constructor function + prototype
definition.



 Or better ... why would anyone expect or want them to be enumerable?


- Consistency with constructor function + prototype definition (severe
refactoring hazard).
- Pretty useful for dynamically creating collection APIs, eg:

  Object.keys(Servo.prototype).forEach(function(method) {
// Create `Servos` collection class wrappers for each method
Servos.prototype[method] = function() {
  var args = [].slice.call(arguments);
  this.each(function(servo) {
Servo.prototype[method].apply(servo, args);
  });
  return this;
};
  });




 To define a `class` is a very explicit intent, I believe having those
 definitions non enumerable would be a preferred option for majority of
 developers that have been doomed in `for/in` since kinda ever before
 enumerable was not configurable.

 All default methods and properties in native prototypes are **not**
 enumerable, why does it have to be so inconsistent with userland?


The widely understood, wholly well-known semantics:

- Properties of built-in prototype objects are non-enumerable
- Properties of user defined prototype objects are enumerable by default,
but can be made non-enumerable if desired.




 You also know ES6 is the only window we have 'cause after that it will be
 a breaking change.


No: any future annotation syntax must allow for defining writable,
configurable and enumerable attributes.




 Thank you at least for any sort of extra/concrete clarification about this
 choice.


-
https://github.com/rwaldron/tc39-notes/blob/master/es6/2012-09/sept-18.md#concise-method-definition-revisited
-
https://github.com/rwaldron/tc39-notes/blob/c61f48cea5f2339a1ec65ca89827c8cff170779b/es6/2014-01/jan-28.md#concise-methods-and-enumerability
- https://esdiscuss.org/topic/enumerability#content-23


The consistency argument has won every time this conversation is brought
up. There are ways to get what you want in the future (probably even in
ES7), but changing the default is not the solution.

Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Glen Huang
There was some heated debate on twitter too just yesterday:
https://twitter.com/domenic/status/547146484479561730 
https://twitter.com/domenic/status/547146484479561730

Just wondering, is es6 class frozen? In those tweets Brendan proposed enum in 
obj lit, not in class”. Looks like class is still open for modification?

 On Dec 24, 2014, at 9:17 AM, Rick Waldron waldron.r...@gmail.com wrote:
 
 
 
 On Tue Dec 23 2014 at 7:35:44 PM Andrea Giammarchi 
 andrea.giammar...@gmail.com mailto:andrea.giammar...@gmail.com wrote:
 Dear Santa,
   I wish since ES3 era that properties defined on a prototype are by default 
 **not** enumerable. 
 
 By any chance we can make this happen in ES6 classes?
 
 ES6 is done, properties of user created prototypes are enumerable by default. 
 They can be made non-enumerable if you want them that way, but doing so by 
 default is inconsistent with constructor function + prototype definition. 
  
 
 Or better ... why would anyone expect or want them to be enumerable?
 
 - Consistency with constructor function + prototype definition (severe 
 refactoring hazard).
 - Pretty useful for dynamically creating collection APIs, eg: 
 
   Object.keys(Servo.prototype).forEach(function(method) {
 // Create `Servos` collection class wrappers for each method
 Servos.prototype[method] = function() {
   var args = [].slice.call(arguments);
   this.each(function(servo) {
 Servo.prototype[method].apply(servo, args);
   });
   return this;
 };
   });
 
  
 
 To define a `class` is a very explicit intent, I believe having those 
 definitions non enumerable would be a preferred option for majority of 
 developers that have been doomed in `for/in` since kinda ever before 
 enumerable was not configurable.
 
 All default methods and properties in native prototypes are **not** 
 enumerable, why does it have to be so inconsistent with userland?
 
 The widely understood, wholly well-known semantics: 
 
 - Properties of built-in prototype objects are non-enumerable
 - Properties of user defined prototype objects are enumerable by default, but 
 can be made non-enumerable if desired.
 
  
 
 You also know ES6 is the only window we have 'cause after that it will be a 
 breaking change.
 
 No: any future annotation syntax must allow for defining writable, 
 configurable and enumerable attributes.
 
  
 
 Thank you at least for any sort of extra/concrete clarification about this 
 choice.
 
 - 
 https://github.com/rwaldron/tc39-notes/blob/master/es6/2012-09/sept-18.md#concise-method-definition-revisited
  
 https://github.com/rwaldron/tc39-notes/blob/master/es6/2012-09/sept-18.md#concise-method-definition-revisited
 - 
 https://github.com/rwaldron/tc39-notes/blob/c61f48cea5f2339a1ec65ca89827c8cff170779b/es6/2014-01/jan-28.md#concise-methods-and-enumerability
  
 https://github.com/rwaldron/tc39-notes/blob/c61f48cea5f2339a1ec65ca89827c8cff170779b/es6/2014-01/jan-28.md#concise-methods-and-enumerability
 - https://esdiscuss.org/topic/enumerability#content-23 
 https://esdiscuss.org/topic/enumerability#content-23
 
 
 The consistency argument has won every time this conversation is brought up. 
 There are ways to get what you want in the future (probably even in ES7), but 
 changing the default is not the solution. 
 
 Rick
 ___
 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


Re: classes and enumerability

2014-12-23 Thread Brendan Eich
It ain't over till it's over. If we can't tweak ES6 to fix a mistake, 
just because process, then we're doing it wrong. OTOH the bar for any 
change, including what is regarded by many (but not all) as a fix, is 
very high.


We should take advantage of es-discuss to debate the crucial question, 
which is not whether enumerable prototype methods are the rule or 
exception -- as Rick said, for built-ins (but not all DOM methods), 
non-enumerable is the common case; for user-defined classes prior to ES5 
and Object.defineProperty, enumerable is the norm.


This is true in the rule/exceptions/confusion sense we all know and hate.

The question is: what should ES6 classes choose as the default? What's 
the most useful default, independent of various backward-looking 
consistencies? What, if the future is bigger than the past, would be best?


In the twitter thread, @wycats and I take on the idea that consistency 
with object literals is required. I hope that's not controversial. Class 
bodies are *not* object literals, in spite of sharing some sub-notation 
(method shorthanding, mostly).


/be

Glen Huang wrote:

There was some heated debate on twitter too just yesterday:
https://twitter.com/domenic/status/547146484479561730

Just wondering, is es6 class frozen? In those tweets Brendan proposed 
enum in obj lit, not in class”. Looks like class is still open for 
modification?

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


RE: classes and enumerability

2014-12-23 Thread Gary Guo
I would say enumerate through classes' or instances' properties are a strange 
use and should be discouraged. I would prefer nothing but instance properties 
to be enumerable. To me, it is illogical for methods to be enumerable.  
  ___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


RE: classes and enumerability

2014-12-23 Thread Jeremy Martin
In all the discussions I've observed, the primary argument for
enumerability has been consistency with ES5 prototype conventions. I don't
think I've seen a single argument in favor, though, based on the actual
intrinsic merits of that behaviour.

So, do such arguments exist?
On Dec 23, 2014 11:26 PM, Gary Guo nbdd0...@hotmail.com wrote:

 I would say enumerate through classes' or instances' properties are a
 strange use and should be discouraged. I would prefer nothing but instance
 properties to be enumerable. To me, it is illogical for methods to be
 enumerable.

 ___
 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


Re: classes and enumerability

2014-12-23 Thread Brendan Eich

Jeremy Martin wrote:
In all the discussions I've observed, the primary argument for 
enumerability has been consistency with ES5 prototype conventions. I 
don't think I've seen a single argument in favor, though, based on the 
actual intrinsic merits of that behaviour.


Right, hence my tweet about A foolish consistency. And the other tweet 
against the argument-from-it's-always-been-that-way(-in-ES3-level-JS) 
fallacy.


Even if you grant that enumerability is unreformable, we have to pick a 
better consistency.


It seems to me that DOM quirky enumerability of prototype methods, and 
legacy ES3-ish enumerability of user-defined methods, do not sum  up to 
better'.


I tweeted several times that the legacy ES3 and below resulting in 
enumerability for theprototypal-pattern's class prototype methods is a 
bug not a feature.


On the DOM quirks point, built-in classes and self-hosting of built-ins 
trump DOM quirks any day. Boris may have a census that argues against my 
weighting, though.


Hence my support for a last-minute fix.

/be


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Kevin Smith

 The question is: what should ES6 classes choose as the default? What's the
 most useful default, independent of various backward-looking consistencies?
 What, if the future is bigger than the past, would be best?


Framed that way, then non-enumerability.

If we want to preserve any kind of conceptual integrity for enumerability,
then enumerability must indicate that the property is a data element within
a data structure.

Whether enumerability is worth preserving, I don't know.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Russell Leggett
On Wednesday, December 24, 2014, Kevin Smith zenpars...@gmail.com wrote:

 The question is: what should ES6 classes choose as the default? What's the
 most useful default, independent of various backward-looking consistencies?
 What, if the future is bigger than the past, would be best?


 Framed that way, then non-enumerability.

 If we want to preserve any kind of conceptual integrity for enumerability,
 then enumerability must indicate that the property is a data element within
 a data structure.

 Whether enumerability is worth preserving, I don't know.

 I'll just throw out mixins as a possible reason to keep enumerability.

- Russ
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Kevin Smith


 I'll just throw out mixins as a possible reason to keep enumerability.


I don't think enumerability really bears on mixins in ES6, because (for
one) the mixin source could have symbol-named properties.  A fully-featured
mixin function will need to use Object.getOwnPropertySymbols, etc.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Glen Huang
Actually mixins shouldn’t be done with Object.assign if that’s what you mean.

I think the language should provide a syntax for that (e.g., Lightweight traits 
on http://www.nczonline.net/blog/2014/06/03/my-ecmascript-7-wishlist/ 
http://www.nczonline.net/blog/2014/06/03/my-ecmascript-7-wishlist/)

 On Dec 24, 2014, at 1:09 PM, Russell Leggett russell.legg...@gmail.com 
 wrote:
 
 
 
 On Wednesday, December 24, 2014, Kevin Smith zenpars...@gmail.com 
 mailto:zenpars...@gmail.com wrote:
 The question is: what should ES6 classes choose as the default? What's the 
 most useful default, independent of various backward-looking consistencies? 
 What, if the future is bigger than the past, would be best?
 
 Framed that way, then non-enumerability.
 
 If we want to preserve any kind of conceptual integrity for enumerability, 
 then enumerability must indicate that the property is a data element within a 
 data structure.
 
 Whether enumerability is worth preserving, I don't know.
 
 I'll just throw out mixins as a possible reason to keep enumerability.
 
 - Russ 
 ___
 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


Re: classes and enumerability

2014-12-23 Thread Glen Huang
Although I guess it’s not very easy to desugar to es5 if there is no way to 
enumerate prototype methods/properties. (probably impossible?)

 On Dec 24, 2014, at 1:17 PM, Glen Huang curvedm...@gmail.com wrote:
 
 Actually mixins shouldn’t be done with Object.assign if that’s what you mean.
 
 I think the language should provide a syntax for that (e.g., Lightweight 
 traits on http://www.nczonline.net/blog/2014/06/03/my-ecmascript-7-wishlist/ 
 http://www.nczonline.net/blog/2014/06/03/my-ecmascript-7-wishlist/)
 
 On Dec 24, 2014, at 1:09 PM, Russell Leggett russell.legg...@gmail.com 
 mailto:russell.legg...@gmail.com wrote:
 
 
 
 On Wednesday, December 24, 2014, Kevin Smith zenpars...@gmail.com 
 mailto:zenpars...@gmail.com wrote:
 The question is: what should ES6 classes choose as the default? What's the 
 most useful default, independent of various backward-looking consistencies? 
 What, if the future is bigger than the past, would be best?
 
 Framed that way, then non-enumerability.
 
 If we want to preserve any kind of conceptual integrity for enumerability, 
 then enumerability must indicate that the property is a data element within 
 a data structure.
 
 Whether enumerability is worth preserving, I don't know.
 
 I'll just throw out mixins as a possible reason to keep enumerability.
 
 - Russ 
 ___
 es-discuss mailing list
 es-discuss@mozilla.org mailto: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


RE: classes and enumerability

2014-12-23 Thread Gary Guo
Object.defineProperty could easily do that.

From: curvedm...@gmail.com
Date: Wed, 24 Dec 2014 13:33:24 +0800

Although I guess it’s not very easy to desugar to es5 if there is no way to 
enumerate prototype methods/properties. (probably impossible?)
  ___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Glen Huang
How?

Given that you don’t know the names of the prototype properties and methods 
contained (could be deep in the prototype chain) in a object. How do you add 
these to another object?

 On Dec 24, 2014, at 1:50 PM, Gary Guo nbdd0...@hotmail.com wrote:
 
 Object.defineProperty could easily do that.
 
 From: curvedm...@gmail.com mailto:curvedm...@gmail.com
 Date: Wed, 24 Dec 2014 13:33:24 +0800
 
 Although I guess it’s not very easy to desugar to es5 if there is no way to 
 enumerate prototype methods/properties. (probably impossible?)

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Glen Huang
I guess it’s probably a misunderstanding.

I was saying that a feature like lightweight traits is probably impossible to 
desugar to es5, if class syntax makes properties and methods non-enum.

 On Dec 24, 2014, at 1:50 PM, Gary Guo nbdd0...@hotmail.com wrote:
 
 Object.defineProperty could easily do that.
 
 From: curvedm...@gmail.com mailto:curvedm...@gmail.com
 Date: Wed, 24 Dec 2014 13:33:24 +0800
 
 Although I guess it’s not very easy to desugar to es5 if there is no way to 
 enumerate prototype methods/properties. (probably impossible?)

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Kevin Smith

 Given that you don’t know the names of the prototype properties and
 methods contained (could be deep in the prototype chain) in a object. How
 do you add these to another object?


getOwnPropertyNames, getOwnPropertySymbols, and getPrototypeOf to traverse
the prototype chain.
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Glen Huang
Oh, forget about those. Thanks. Then problem solved.

non-enum class syntax + trait syntax. This could make prototypal inheritance a 
joy to write. :)

 On Dec 24, 2014, at 2:02 PM, Kevin Smith zenpars...@gmail.com wrote:
 
 Given that you don’t know the names of the prototype properties and methods 
 contained (could be deep in the prototype chain) in a object. How do you add 
 these to another object?
 
 getOwnPropertyNames, getOwnPropertySymbols, and getPrototypeOf to traverse 
 the prototype chain.
 

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Glen Huang
Although when desugaring to es5, no need to consider symbol properties.

 On Dec 24, 2014, at 2:02 PM, Kevin Smith zenpars...@gmail.com wrote:
 
 getPrototypeOf

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: classes and enumerability

2014-12-23 Thread Boris Zbarsky

On 12/23/14 8:49 PM, Brendan Eich wrote:

On the DOM quirks point


Here's the thing.  Ignoring for the moment the classes situation, it 
seems to me that for DOM stuff specifically we have three options:


1)  Have all DOM prototype stuff be enumerable.  This leaves us in a 
Conway's Law situation where whether stuff is enumerable or not depends 
on whether the spec is written by the W3C/WhatWG or TC39.  That's where 
we've been for going on two decades now, but it still sucks.


2)  Have some DOM stuff (whatever is currently shipping?) enumerable 
but new stuff not enumerable (basically introduce a 
[LegacyEnumerableProperties] or whatnot in Web IDL and sprinkle it on 
everything currently shipping).  This still means we have inconsistent 
behavior, but now it's inconsistent in time as opposed to organizational 
structure.  And it relies on UAs being able to make this change quickly 
for new APIs they add.  Gecko can do that, but I can't speak for others.


3)  Try to make all DOM stuff non-enumerable, dealing with compat 
issues by adding [LegacyEnumerableProperties] in the few cases where 
they arise.  This risks landing us in the same place as #2 depending on 
how many interfaces need the annotation, plus compat fallout as we 
discover which interfaces need it.  But it would maybe get us to the 
point where we don't have the Conway's Law problems, and it may well 
turn out that very few interfaces need the [LegacyEnumerableProperties] 
thing.


If I were doing green-field implementation of the DOM, of course, option 
3 it would be, to match ES builtins


Apart from all that, we've generally been aiming at converging Web IDL 
behavior on the behavior of ES6 classes as much as we can, and continue 
to do so.  So if classes end up with stuff non-enumerable by default 
that would militate in favor of option 3 above.  Which is great except 
for the possible compat fallout.  I'm game for trying it, though, if 
other UAs are.


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-13 Thread Boris Zbarsky

On 1/12/14 11:57 PM, Andrea Giammarchi wrote:

Recap: it seems we agree classes properties and methods should not show
up in a for/in


I should note that web developers commonly expect DOM methods/properties 
to show up in for/in (and in fact often write code depending on that, 
sometimes depending on the order of the enumeration).  So to the extent 
that we're trying to align DOM stuff with ES6 classes, we may need a 
class-level switch to decide whether a particular class has enumerable 
members or something.  :(


-Boris
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-13 Thread Axel Rauschmayer
True. I was thinking shallow clone:

```js
var copy = Object.assign({ __proto__: obj.__proto__ }, obj);
```

But `Object.mixin()` (or `Object.define()`, I thought the case for re-renaming 
it was convincing) is probably a better match here.

Will `keys()`, `values()` and `entries()` from module @dict ignore 
non-enumerable properties, too?

Axel

On Jan 12, 2014, at 6:28 , Brendan Eich bren...@mozilla.com wrote:

 Brendan Eich wrote:
 I can only think of cases (including Claude Pache’s pro-enumerability 
 example) where I would want to copy *all* own properties.
 
 Why do you want an array's .length to be copied? 
 
 Or in Claude's example, why should a non-enumerable _parent be copied?
 
 Claude's words about the advantage of non-enumerable _parent *not* being 
 copied were pretty clear. He was not advocating *all* own properties.
 
 http://esdiscuss.org/topic/enumerability#content-2

-- 
Dr. Axel Rauschmayer
a...@rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-13 Thread Andrea Giammarchi
Also true ... it's funny 'cause for ages we, developers, tried to make ES3
classes non enumerable so that for/in were not affected, we could extend
(avoiding conflicts, etc) and now that we could define such behavior as
default through a new ES6 class syntax we are worried that is not what
developers want ... I thought the fact basically every piece of code based
on `.hasOwnProperty()` check as first line of any `for/in` would be already
convincing nobody wants class enumerability and indeed I usually define
prototypes via defineProperties in a non enumerable way, but maybe I am the
only that never wanted/needed inherited enumerability for classes.

That being said the single/multiple mixin through prototype would be a
problem, if done pragmatically, but it can be easily solved with
`getOwnPropertyNames` ?

Make classes methods/properties enumerable by default ... I am still not
convinced is useful and I don't remember other OOP languages exposing
classes properties within loops.

Anyway, not a big deal, nothing to go nuts about ... we can all keep coding
anyway.

Best Regards




On Mon, Jan 13, 2014 at 7:53 AM, Allen Wirfs-Brock al...@wirfs-brock.comwrote:


 On Jan 13, 2014, at 6:46 AM, Boris Zbarsky wrote:

  On 1/12/14 11:57 PM, Andrea Giammarchi wrote:
  Recap: it seems we agree classes properties and methods should not show
  up in a for/in
 
  I should note that web developers commonly expect DOM methods/properties
 to show up in for/in (and in fact often write code depending on that,
 sometimes depending on the order of the enumeration).  So to the extent
 that we're trying to align DOM stuff with ES6 classes, we may need a
 class-level switch to decide whether a particular class has enumerable
 members or something.  :(

 Whatever the default enumerability, you can always change it using
 Object.defineProperty and you can write a utility function that will does.
 Define the utility as a method on function prototype and you can say
 something like:

 class Foo {};
 Foo.enumerableMethods();
 //or
 Foo.nonenumerableMethods();

 Allen

 ___
 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


Re: Enumerability

2014-01-12 Thread Rick Waldron
On Sat, Jan 11, 2014 at 12:24 PM, Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 I would like to see some Rick or David example about the expected to be
 enumerable.

 If that's about knowing if a class is native or not, looping with a for/in
 its prototype or any instance does not seem to mean anything reliable since
 even native methods can be redefined and made enumerable.


Making concise method definitions default to enumerable: true had _nothing_
to do with classes and everything to do with code that *consumes* objects
with concise method definitions. Refactoring this:

  var o = {
method: function() {
}
  };

To this:

  var o = {
method() {
}
  };


Should absolutely not change the resulting behaviour of a for-in loop over
o's properties. I don't know why Allen said that for-in has been deprecated
in favor of for-of, since the latter doesn't imply iteration over the
properties of a plain object. That's not going away.

Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-12 Thread Rick Waldron
On Sat, Jan 11, 2014 at 12:57 PM, Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 Thanks Allen, makes sense ... but still no example where enumerability of
 properties and method defined in a class prototype is useful for ...
 something I cannot imagine right now.

 Again, that was never the argument, but simply a by-product of making
concise method definitions behave the same way as function expression
definitions.

Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-12 Thread Andrea Giammarchi
Rick, what you wrote has _nothing_ to do with inheritance, right? So why
should classes methods be part of a for/in of an instance, which is not
what you wrote, again? Thanks


On Sun, Jan 12, 2014 at 8:21 PM, Rick Waldron waldron.r...@gmail.comwrote:




 On Sat, Jan 11, 2014 at 12:57 PM, Andrea Giammarchi 
 andrea.giammar...@gmail.com wrote:

 Thanks Allen, makes sense ... but still no example where enumerability of
 properties and method defined in a class prototype is useful for ...
 something I cannot imagine right now.

 Again, that was never the argument, but simply a by-product of making
 concise method definitions behave the same way as function expression
 definitions.

 Rick


___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-12 Thread Andrea Giammarchi
Recap: it seems we agree classes properties and methods should not show up
in a for/in ... which I believe is the eldorado JS developers looked for
since ever, hating that only native classes had that privilege ... so, once
again why on earth classes methods and properties show up in a for/in since
nobody ever wanted that?

I agree that the method definition for the object should not be affected,
but it seems to me we mixed up two different things: a) the object method
definition, and we all agree here b) inherited classes properties and
methods ... and I guess we all dream about not disturbing/enumerable
properties and/or methods in a for/in since that is not desired and forces
indeed developers to think they need .hasOwnProperty() check all over which
is an anti-pattern if you ask me, and indeed my class utility defines
everything in the class as **non-enumerable**.

Thanks for clarifications


On Sun, Jan 12, 2014 at 8:45 PM, Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 Rick, what you wrote has _nothing_ to do with inheritance, right? So why
 should classes methods be part of a for/in of an instance, which is not
 what you wrote, again? Thanks


 On Sun, Jan 12, 2014 at 8:21 PM, Rick Waldron waldron.r...@gmail.comwrote:




 On Sat, Jan 11, 2014 at 12:57 PM, Andrea Giammarchi 
 andrea.giammar...@gmail.com wrote:

 Thanks Allen, makes sense ... but still no example where enumerability
 of properties and method defined in a class prototype is useful for ...
 something I cannot imagine right now.

 Again, that was never the argument, but simply a by-product of making
 concise method definitions behave the same way as function expression
 definitions.

 Rick




___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-12 Thread Rick Waldron
On Sun, Jan 12, 2014 at 11:45 PM, Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 Rick, what you wrote has _nothing_ to do with inheritance, right? So why
 should classes methods be part of a for/in of an instance, which is not
 what you wrote, again?


Sometimes I find you incredibly frustrating to communicate with. You asked
me to give an example of expected to be enumerable and I did so by
providing an example in the form that I made my original argument for
revisiting the decision to make concise method definitions non-enumerable.
Specifying concise method definitions to be enumerable: true in all cases
is consistent with defining a method on a prototype object today:


  function C() {}
  C.prototype.method = function() {};

  for (var p in C.prototype) {console.log(p)}

   method

Refactor #1:

  function C() {}
  C.prototype = {
constructor: C,
method() {}
  };

  for (var p in C.prototype) {console.log(p)}

   method

Refactor #2:

  class C {
method() {}
  }

  for (var p in C.prototype) {console.log(p)}

   method


Now that I've described as clearly as I possibly can, I hope the point of
making concise method definitions—regardless of which syntactic body form
they appear in—produce an enumerable: true property is clear to you and
that my answer has sufficiently met your need.

Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-12 Thread Rick Waldron
On Sun, Jan 12, 2014 at 11:57 PM, Andrea Giammarchi 
andrea.giammar...@gmail.com wrote:

 Recap: it seems we agree classes properties and methods should not show up
 in a for/in ...


No we don't agree, because that's inconsistent with the behaviour that
exists today.

Rick
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-12 Thread Andrea Giammarchi
classes do not exist today and your example was about direct object, not
inherited from classes as they are meant in ES6.

I see from both here and Twitter you took this in a very wrong way while I
was asking rationale from those Allen's quotes you actually rephrased so I
just stop here.

All good, for/in with classes properties/methods is all we wanted/needed in
ES6, thanks.

Best Regards


On Sun, Jan 12, 2014 at 9:05 PM, Rick Waldron waldron.r...@gmail.comwrote:




 On Sun, Jan 12, 2014 at 11:57 PM, Andrea Giammarchi 
 andrea.giammar...@gmail.com wrote:

 Recap: it seems we agree classes properties and methods should not show
 up in a for/in ...


 No we don't agree, because that's inconsistent with the behaviour that
 exists today.

 Rick

___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-11 Thread Axel Rauschmayer
 I think it would really help the design of ECMAScript going forward if we 
 had a definitive and complete explanation of what enumerability is now and 
 what it should be in the future. I’m trying to make sense of it and to 
 explain it to others and continue to fail.
 
 I can't provide a definite abstract explanation, but here is a practical 
 situation where I've found non-enumerability a useful feature, although it 
 does not exactly fit any of the four explanations you cited. Consider some 
 tree structure:
 
obj = { foo: 1, bar: 2, children : [ { foo: 5, bar: 4 }, { foo: 2, bar: 4, 
 children: [...] } ] }
 
 When walking through such a tree, I typically want to have access (for 
 example) to the parent of a node (just like the `parentNode` method of `Node` 
 objects in the DOM). For that end, I define a *non-enumerable* `_parent` 
 property on each node, which refers back to its parent node. Now, although I 
 have polluted each node with a supplementary property, 
 
 * I can happily invoke `Object.keys` on a node, and it will give me back the 
 correct answer;
 * I can happily serialise my tree using `JSON.stringify`, and it won't 
 complain that it can't handle cyclic structures. After deserialising it with 
 `JSON.parse`, I just have to recursively reconstruct the `_parent` 
 back-references;
 * etc.


Nice example. Data versus meta-data, in line with the `length` of an array 
being non-enumerable.

-- 
Dr. Axel Rauschmayer
a...@rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-11 Thread Brendan Eich

Axel Rauschmayer wrote:
Nice example. Data versus meta-data, in line with the `length` of an 
array being non-enumerable.


Yes, and that's the primordial reason for enumerability. But it still 
seems that class declaration users might want methods on the prototype 
to be non-enumerable. Sauce for the goose (built-ins).


/be
___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


Re: Enumerability

2014-01-11 Thread Axel Rauschmayer
 ### I’m looking for a simple explanation of what enumerability will be, 
 going forward. If there isn’t one then I’d argue that no new feature should 
 be influenced by it.
 
 That was one of the argument made in favor of concise methods defaulting as 
 not enumerable: enumerable really only controls whether a property shows up 
 in for-in (and a couple closely related reflection functions) and for-in has 
 been essentially deprecated and replace by for-of.  That makes the enumerable 
 attribute an obsolete feature and we should be trying to give it meaning for 
 new features.  Hence, just always default it to true.

Good point. That “meaning for new features” should probably be clearly stated 
and dictate how `Object.assign()` behaves.

I know this runs counter the conventional wisdom for specs, but I find design 
rationales incredibly important for making sense of what’s going on: The 
answers and discussions on this mailing list were essential in helping me 
understand the language.

Axel

-- 
Dr. Axel Rauschmayer
a...@rauschma.de

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com



___
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss


  1   2   >