The class operator: a bridge between object and function exemplers
Brendan Eich
brendan at mozilla.com
Mon Nov 14 14:01:55 PST 2011
On Nov 14, 2011, at 12:16 PM, Allen Wirfs-Brock wrote:
> let Point = {
> x:0,
> y,0,
> constructor(x,y} {
> this.x=x;
> this.y=y;
> }
> }.constructor; //<----------- note added property reference
>
> let p = new Point(1,2); //new operator applied to a constructible function
So can you spec operator new a bit? It tries [[Construct]] and if missing, tries for a .constructor property that it calls on a fresh instance of Object whose [[Prototype]] is the exemplar?
Dave's work on http://wiki.ecmascript.org/doku.php?id=strawman:minimal_classes brought to light some added wiring that comes for free in the prototypal pattern when you write a constructor function as a function declaration: the intrinsic name of the constructor function is the class name.
For exemplars, if constructor is defined using method definition shorthand,
http://wiki.ecmascript.org/doku.php?id=harmony:object_literals#object_literal_property_shorthands
says the intrinsic name will be 'constructor'. This will be a drag in debugging scenarios. You'll want to see Point, Square, Circle, Ellipse, Rectangle, etc. but all you'll get is 'constructor' every time.
The attributes in the http://wiki.ecmascript.org/doku.php?id=harmony:object_literals#object_literal_property_shorthands section are frosty. Is that the right default for methods? Is it the right one for constructor in particular? I'm just asking, this is a separate issue but I spotted it and wanted to get it out before forgetting.
> 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).
> The class operator can prefix any UnaryExpression, not just object literals. That means that the class operator can be used to classify objects:
>
> if (class p === Point) ...
This is good.
It has the same multiple-global issue that instanceof has.
> Note that many object-oriented abstraction designers consider this for of class testing to be an anti-pattern.
Yup but it has its uses occasionally.
> Relationship between the class and instanceof operators
>
> There isn't one. They are different operators. class is simply a short hand for accessing an object's constructor property instanceof tests a specific inheritance relationship.
Oh, but weren't you going to make instanceof work with an object exemplar on the right?
/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20111114/68788df5/attachment.html>
More information about the es-discuss
mailing list