On 15.11.2011 11:50, Dmitry Soshnikov wrote:
On 15.11.2011 2:01, Brendan Eich wrote:
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'
Sorry, perhaps I'm missing something (correct me if I'm wrong), but
seems this algorithm just not working.
According to examples, yes, the Point is set to the function
previously referred by temporary created object's `constructor'
property. But what's then?
Instances created by such a constructor, will have prototype set to
`Object.prototype' (since it's the value of `Point.prototype' now).
Therefore, the do not see neither specified `x' and `y' default
(shared, static) properties, nor any other method placed on that
temp-object:
You may of course try to set Point.prototype = Point after that in a
hope that it starts to see the properties, but it's obviously useless
since Point already is set to temp-object's `constructor' property and
actually is missed by GC.
Woops.. :) (I realized that I have 40 unread mails which I missed, so I
guess it's very likely already was mentioned; sorry in case)
Dmitry.
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
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss