On Nov 14, 2011, at 12:16 PM, Allen Wirfs-Brock wrote:

> Using object exemplars, the named abstraction is itself an instance of the 
> abstraction. Some people seem to be perfect happy to only have and use this 
> form of object abstraction.  However, others prefer to think in a more 
> "classical" style where the named object representing an abstraction is a 
> distinct kind of object that is not itself an instance of the abstraction. In 
> practice, these two views of object abstraction are very closely related/  
> For example, a very simple addition to the above definition essentially turns 
> Point into a "function exemplar".  Function exemplars can also be thought of 
> as "class exemplars":
> 
> let Point = {
>      x: 0,
>      y: 0,
>      constructor(x, y) {
>          this.x = x;
>          this.y = y;
>      }
> }.constructor;   //<----------- note added property reference

Apologies in advance if this has already been proposed, but I was looking at 
the exemplar examples, and wondering if an additional small extension to object 
literal syntax might provide a rather nice way to support 'static' (or class) 
properties, per the ClassPropertyDefinition properties of the minimal classes 
proposal.  Could we permit dot notation to allow properties to be defined on 
other properties already being defined within the literal?  E.g.:

let o1 = {
    o2: {
        x: 1
    }
    o2.y: 2
};

This example would define an object o1 with one property, o2, which in turn 
contains two properties, x & y.  I think this dot notation could be generally 
useful in defining object literals, but it seems like it could be particularly 
useful when defining exemplar objects since it would allow properties to be 
defined on the constructor property, for example defining a function property 
on the constructor:

let Point = {
     x: 0,
     y: 0,
     constructor(x, y) {
         this.x = x;
         this.y = y;
     },
     constructor.fromPolar: function(radius, azimuth) {
         return new Point(radius * Math.cos(azimuth), radius * 
Math.sin(azimuth));
     }
}.constructor;

let p = Point.fromPolar(Math.sqrt(2), Math.PI/4)
print(p.x, p.y);

If this dot notation could also be used when defining methods (functions 
omitting the function keyword, as per the constructor method in the exemplars 
example), and if these methods were to also have their prototype property set 
to point to the containing object literal (again, as per the constructor 
method), then it would also make it possible for methods to be defined with in 
the intention of use with the 'new' keyword as alternative constructors for the 
type, e.g.:

let Point = {
     x: 0,
     y: 0,
     constructor(x, y) {
         this.x = x;
         this.y = y;
     },
     constructor.Polar(radius, azimuth) {
         this.x = radius * Math.cos(azimuth);
         this.y = radius * Math.sin(azimuth);
     }
}.constructor;

let p = new Point.Polar(Math.sqrt(2), Math.PI/4)
print(p.x, p.y);

Further, if dot notation were also allowed in defining getter/setter properties 
I believe it would make this syntax fully sufficient to define all types of 
properties on the constructor as described in the ClassPropertyDefinition 
grammar in the minimal classes proposal.

Any thoughts on this suggestion would be appreciated.

Many thanks & happy thanksgiving!,
Gavin.

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

Reply via email to