> On Mar 5, 2015, at 9:20 AM, Kevin Smith <[email protected]> wrote:
> 
> However, the double-binding issue makes this weirder. If non-const-class 
> declarations were like non-const-function declarations, where there is only 
> one binding per defining occurrence, then I would fully agree. But this issue 
> of one defining occurrence creating two bindings that can diverge is a new 
> level of unpleasantness. I agree this calls for the issue to be fixed now in 
> ES6 if we can, for non-const-classes.
> 
> OK - I see.  So on one side (double-binding) the risk is that someone will 
> change the outer binding and violate an implicit assumption that references 
> inside the class body and outside point to the same thing.  On the other 
> side, the risk is that we disable hackery like:
> 
>     class C {}
>     if (someCondition) {
>      C = class OtherC {};
>     }
> 
> But you can always write the above as:
> 
>     let C = class {};
>     if (someCondition) {
>      C = class OtherC {};
>     }
> 
> I think you've sold me.  I'm worried that there might be other 
> hacker-use-cases that I'm not considering, though.


Isn’t making `Foo` a const inconsistent with the rest of the language? You can 
redefine a function. Currently you can do this anyway:

const C = class {};
if (someCondition) {
 C = class OtherC {};
}

If not fixing the double bind not an option? If it isn’t an option, why not 
make a class reference itself by name be an undefined error:

```
class Foo {
  static makeFoo() {
    return new Foo(); // Foo should be undefined!
  }
}
// Foo should be considered defined at this point.
``

Because you can do this and it would likely not be correct either:

```
class Foo {
  static makeFoo() {
    return new Foo();
  }
  foo() {

  }
}

var FooWithLogging = class extends Foo {
  foo() {
    super.foo();
    console.log(“log!”);
  }
}

FooWithLogging.makeFoo().foo();
```

In most (all?) of these situations `this.constructor` or 
`this.prototype.constructor` should be used anyway, right? Doing that in 
Jason’s example bypasses the binding issue.

Although getting at `constructor` is a bit cumbersome, so it would be nice if a 
`self` keyword existed:

```
class Foo {
  method() {
    new self(); // same as `new this.constructor()`
  }
  static method() {
    new self(); // same as `new this.prototype.constructor()`
  }
}

function foo() {
    self(); // same thing as `foo()`
}
```

Is there any reason for a class to reference itself by name where getting its 
`constructor` thru `this` wouldn’t work?

--
Luke

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to