David Bruant wrote:
> 2012/10/3 Herby Vojčík <he...@mailbox.sk <mailto:he...@mailbox.sk>>
>
>     Hello,
>
>     now that we have symbols (and use some of them language-wise, like
>     @iterator or proposed @toStringTag), I'd say we can probably dissect
>     [[Call]] and [[Construct]] semantics fairly easily. Assuming there
>     are global constant symbols @construct and @call,
>
> And I assume being able to arbitrarily change the [[Call]] and
> [[Construct]] of a function at any time?
>
>     for min-max classes the issue is very simple:
>
>     class Foo {
>              @construct(bar) {
>                      this.bar = bar;
>              }
>              @call() {
>                      // do something else
>              }
>     }
>
> I'm not sure this is appropriate for min-max classes. These are not so
> much private properties as they are internal properties.

They are not private symbols, they are unique symbols. Like @iterator. And they are not used to define properties (see below).

>     I'd propose the above as the minimal proposal for [[Call]] and
>     [[Construct]] separation (even when it only works for classes; and
>     so they can be abused to create function with [[Call]] and
>     [[Construct]] separated).
>     Implementation would be to create Foo such that it chooses one or
>     the other based on whether [[Call]] or [[Construct]] is invoked.
>
> So I guess I misanderstand. Do you want @call and @construct to be
> properties of instances of the constructor?

I want them to be properties of nothing. `constructor` is also just a convention (stemming from the fact that, in fact, property named constructor is created in the prototype in case of plain constructor function and holds a pointer to the constructor function).

I want the @construct and @call symbols to be used as a convention to specify [[Construction]] and [[Call]] behaviour for the class.

Some sensible defaults being applied when only one is present, like [[Construct]] will reuse @call (in [[Construct]] way) if only @call is present, and [[Call]] will throw is only @construct is present (it is a class, after all).

But otherwise, they should only work as convention names and the resulting (class? constructor function?) created so that it has appropriate [[Construct]] and [[Call]] behaviour.

>     It could go further, like this:
>
>     var f = { @construct() {console.log(1)}, @call() {console.log(2)} };
>     f(); // logs 2
>     new f; // logs 1
>
> var f  = new Proxy(function(){console.log(1)}, {construct:
> function(){console.log(2)}});
> Arguably, this is as readable (and efficient) and yields the same result.

Hm, interesting, if it is this short, it is hard to beat. It is a proxy, though, is it really efficient? But yes, it is simple.

> David
Herby
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to