Le 21/04/2013 19:22, Brendan Eich a écrit :
At JQueryUK, I threw up a sketch in slides based on http://wiki.ecmascript.org/doku.php?id=strawman:relationships:

|class  SkinnedMesh extends  THREE.Mesh{
  private  identityMatrix,
          bones,
          boneMatrices;

  constructor(geometry,  materials)  {
    super(geometry,  materials);

    this@identityMatrix=  new  THREE.Matrix4();
    this@bones=  [];
    this@boneMatrices=  [];
    ...
  }

  ...
}|
Can you provide more details on the semantics of syntax given the relationship strawman?
With my understanding of the current proposal:
* in "this@bones = [];", 'bones' has to be a string or (unique) symbol. I imagine the private syntax makes it a symbol (that will not be access beyond the class scope) for the sake of non-forgeability. * by default, objects have no value for @geti nor @seti [1], so following the strawman, "this@bones = [];" should set the value for the symbol. Unfortunately, (unique) symbols are enumerated via reflection, so this is not private.

Sharing my thoughts trying to figure out the semantics you want to provide:
Was it implicit that each class declaration creates a @geti/@seti pair as I describe at [2] and attach it to SkinnedMesh.prototype? Hmm... if the pair on the prototype, then it can be shadowed by an outsider via Object.defineProperty. I believe this shadowing will give access to the symbol that was supposed to remain encapsulated any time the @-syntax is used and break privacy. So no prototype. So the last chance is for the class @geti/@seti pair to be assigned as own property to each instances. And preferably make them non-configurable/non-writable properties so they remain where they are. One pair of property per instance may have a cost, but it sounds possible to heavily optimize in memory frozen properties of the same class for the 80% use case. Even as own property, I believe inheritance can be made worked out (a class extending another accesses the inherited class @geti/@seti pair and builds its own pair on top of that. Well-encapsulated symbols won't collide from one class to another).

Was it what you had in mind?


|class  Point{
  constructor(private x, private y) {}
  add(other) {
    return Point(this@x + other@x, this@y + other@y);
  }
  ...
}
|
I'm guessing explanations to the above will lighten up my understanding of this part, but in case there is something non-trivial to explain here, I'll take it too.

Thanks,

David

[1] Last answer to Tom of https://mail.mozilla.org/pipermail/es-discuss/2013-April/029697.html [2] Last answer to Tom of https://mail.mozilla.org/pipermail/es-discuss/2013-April/029700.html
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to