Allen Wirfs-Brock allen at wirfs-brock.com
Fri Jan 10 14:10:57 PST 2014

On Jan 10, 2014, at 11:49 AM, Brendan Eich wrote:

> Axel Rauschmayer wrote:
>> * Built-in prototype methods are non-enumerable, as is property `length` of arrays.
> Good, more consistency with existing objects.
>> * In ECMAScript 6, prototype methods created by classes are enumerable, the prototype method `constructor` is non-enumerable (as it is by default in all functions).
> This may be a mistake. Prototype methods defined in JS are enumerable up to ES5 unless you use Object.defineProperty. Prototype methods on builtins are not enumerable. Something has to give.

The ES6 class specification originally made  prototype methods (we didn't have static methods at the time) non-enumerable.

That was changed at the Sept 19, 2012 TC39 meeting https://mail.mozilla.org/pipermail/es-discuss/2012-September/025231.html 
> # Concise Method Definition, Revisited
> RW: Defaulting concise methods to non-enumerable is a mistake
> DH: Not sure about the decision to go non-enumerable. Users expect that
> things they create to be enumerable and things that the platform provides
> to be non-enumerable.
> LH: enumerability is not a real concept with any sort of meaning.
> EA: (reveals the broken-ness of the DOM)
> No longer arguable.
> **Conclusion/Resolution**
> Concise method definitions create [[Enumerable]]: true
I went along with the majority, although I don't really like it very much.

It's basically a question of whether class definitions follow the pattern of pre-ES6 built-in or the pattern of pre-ES6 manually constructed constructor/prototype pairs.

Early on we decided to follow the built-in pattern, but at that meeting we changed it WRT enumerability of methods.

It comes down to this

class C extends Array {
   foo() {}

let c = {foo() {}}

let assignedClass = Object.assign({ }, C.prototype);
let assignedObjLit = Object.assign({ }, c);

original class design:
  typeof assignedClass.foo   //Undefined
  typeof assignedObjLit.foo  //Undefined

current ES6 spec:
  typeof assignedClass.foo   //function
  typeof assignedObjLit.foo  //function

another plausible design:
  typeof assignedClass.foo   //Undefined
  typeof assignedObjLit.foo  //function

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140110/684ea7d3/attachment-0001.html>

More information about the es-discuss mailing list