The class operator: a bridge between object and function exemplers
Allen Wirfs-Brock
allen at wirfs-brock.com
Mon Nov 14 17:04:04 PST 2011
On Nov 14, 2011, at 4:05 PM, Jake Verbaten wrote:
>> UnaryExpression :
>> class UnaryExpression
>> ...
>>
>> The semantics are:
>> 1. if UnaryExpression is undefined or null, return the value of UnaryExpression.
>> 2. Let obj be ToObject(UnaryExpression)
>> 3. Return the result of calling the [[Get]] internal method of obj with argument 'constructor'
>
> Interesting, so 'constructor' will inherit from Object.prototype if missing from the exemplar. This means
>
> let Point = class {
> x:0,
> y,0
> };
>
> let p = new Point(1, 2);
>
> will result in p being constructed via the equivalent of new Number(1).
>
sh*t! I though I'd had a solution for this, but maybe I don't...
If you are really going to define either an object or class exemplar, you really need to define a constructor. The object exemplar case actually works out ok in this case because the inherited constructor is "called as a function", not "as a constructor". So for
let Point = {
x: 0,
y: 0
};
let p = new Point(1,2);
Is pretty much equivalent to:
let p = Point <| {};
which may not be exactly what the programmer expected but it is a least in the vicinity and yields an object with (inherited) x and y properties.
> When you create a function, it has an automatically created prototype object who has a constructor property defaulted to the original function.
>
> Why would it be bad to augment the UnaryExpression after the class keyword so that it has an empty constructor if it doesn't exist?
that would turn class from a simple property accessing operator to a mutating operator that I'm sure would never be accepted.
A pattern like:
class { }
should always have a constructor specified in the object literal but saying the class operator (as I'm trying to define it) adds a constructor seems very unhygienic. Of course, it would be great if my IDE, or even my ES engine warned me when I coded this. Maybe that's enough. But I suspect that it isn't. I'm going to have to put some more thought into the own vs inherited constructor part of the design.
Allen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20111114/d203f359/attachment.html>
More information about the es-discuss
mailing list