Sep 27 meeting notes

Erik Arvidsson erik.arvidsson at gmail.com
Thu Sep 29 17:10:04 PDT 2011


On Thu, Sep 29, 2011 at 16:54, Brendan Eich <brendan at mozilla.com> wrote:
> On Sep 30, 2011, at 12:22 AM, Erik Arvidsson wrote:
>
> 4. Allow const classes
>
> Hold this thought...
>
> The question is do we have to solve these? I argue that we don't have
> to solve these for ES.next. By postponing these we can provide an even
> simpler class proposal that provides sugar to how people do
> inheritance today using ES5.
>
> Obviously I like your thinking! Don't take my nit-picking below wrong.
> Please do pick or prove harmless-if-not-beneficial every nit.
>
> class Derived extends Base { // Object literal body
>  constructor(x) {  // constructor
>    this._x = x;  // no special form
>    // Disallow return expr?
>  }  // optional comma from @awbjs
>  get x() { return this._x; }
>  prop: 42,
>  method() {}  // method form @awbjs
> };
>
> Waldemar had some objections to comma elision in object literals, they would
> apply here too or need to be overcome. If we support only methods, then
> class body syntax can be its own thing, and drop otiose commas or other
> separators. But your prop:42 needs a , after it, Waldemar's counterexample
> used [privateName] as the next key and that would instead "index" into the
> previous property's value.
> So why do we need prototype data properties? I'd drop them as my (4), and
> keep const classes (since Mark will insist, and the desugaring is easy
> enough -- more below).
>
> This is syntactic sugar for
>
> var Derived = Base <| function(x) {
>  this._x = x;
> }.prototype.{
>  get x() { ... },
>  prop: 42,
>  method() {}
>  constructor: Derived // hand wave here, needs {enumerable: false}
> and reference to something not yet available.
>
> No need for "constructor: Derived // hand wave..." because <| clones (or
> unobservably mutates) its RHS function, and functions get .prototype
> properties with magic .constructor back-links for free. The mustache you use
> in the desugaring *extends* Derived.prototype, it does not lose the default
> .constructor back-link in that object.
> However, you do need a .constructor at the end, so the constructor and not
> its prototype is assigned to var Derived.
> Nit: s/var/let/ -- class should bind as let does, block-scoped and hoisted
> with temporal dead zone.
> Ok, here's the const class desugaring:
> const Derived =
>  Object.freeze(
>   Object.freeze(
>    Base <| function(x) {
>     this._x = x;
>     Object.seal(this);
>    }.prototype.{
>     get x() { ... },
>     prop: 42,
>     method() {}
>    }
>   ).constructor
>  );
> If you buy this, then I think class methods and other properties of the
> constructor are equally easy. We can defer them, but they do not add novel
> challenges as const instance variables and barriers to prevent partially
> initialized objects from leaking do. The only vexing issue is what syntax to
> use? A "static" keyword is at this point traditional, but we all hate it.
> Are we being too pure?
> /be

I would also be fine with a special class body.

I'm also fine with 'static'. Like everybody, I don't really like the
name but it is the best we have at the moment.

-- 
erik


More information about the es-discuss mailing list