Hi Maciej,
Le 08/01/2014 09:59, Maciej Jaros a écrit :
To my understanding private name objects
Note that now their name is "symbol" and not "private name" anymore.
are supposed to make private properties and functions available for
new classes syntax in ECMAScript 6 standard.
A "private" keyword will be introduced in ES7. There is still
disagreement on the specifics of the semantics.
But the syntax is rather strange:
```
var myPrivate = new Name();
class Test {
constructor(foo) {
this[myPrivate] = foo;
}
}
```
I understand the motivation - using just `this[myPrivate]` wouldn't
work because it could be inconsisten when `myPrivate` is a string
variable. If `myPrivate='abc'` then `this[myPrivate]` is equivalent
`this.abc`... So that is the main reason Name objects were born, right?
For the sake of making your code easier to write, read and understand,
you wouldn't reassign "myPrivate", preferably even declare it with
"const" instead of "var".
BUT what is the point of having this new syntax if I need to predefine
all private variables (also the ones used for methods)?
It's a temporary setup. A "private" keyword will be introduce and
provide runtime-level privacy (as opposed to source-level privacy like
TypeScript does)
Instead of above I could just use (shorter, more intuitive, already
works):
```
var myPrivate;
class Test {
constructor(foo) {
myPrivate = foo;
}
}
```
I could also secure the scope which would still be shorter for more
then one variable:
```
(function(){
var myPrivate, myPrivate2;
class Test {
constructor(foo) {
myPrivate = foo;
myPrivate2 = foo.toString();
}
}
})()
```
Does it really already works? It looks to me like your private variables
are shared by all instances (while private in class is supposed to be
per instance). When the constructor is called twice, only the last
values will remain.
I'm probably missing some optimization points but I was unable to find
them on ES Wiki.
I believe the wiki is outdated. [1] has a message at the top saying:
"This proposal has progressed to the Draft ECMAScript 6 Specification,
which is available for review here: specification_drafts. Any new issues
relating to them should be filed as bugs at http://bugs.ecmascript.org.
The content on this page is for historic record only and may no longer
reflect the current state of the feature described within."
The only new thing is the Name object. I see no use case for it and it
doesn't seem to be more readable then current solution.
Per-instance runtime-level privacy. JavaScript lacks this badly. Note
that I didn't mention classes. We need privacy even beyond the context
of classes.
It's possible to achieve it with WeakMap with something along the lines of:
````js
var privateState = new WeakMap();
function createPrivateState(o){
privateState.set(o, {});
}
function _private(o){ // "private" is a reserved keyword
return privateState.get(o);
}
class C{
constructor(yo){
createPrivateState(this);
_private(this).yo = yo;
}
getYoPlusTwo(){
return _private(this).yo+2;
}
}
````
But performance are certainly attrocious because of the WeakMap lookup
by comparison to what it could be if the property was a string or symbol.
What I'm saying is - please consider dropping `Name` objects and use
some new syntax (e.g. `this#variable`) to avoid clashes but make
declarations more readable for humans.
I can't speak for TC39, but from what I see and read, they're not going
to drop symbols.
Note that regarding privacy, there is the "relationship" strawman on the
table IIRC
http://wiki.ecmascript.org/doku.php?id=strawman:relationships
I've lost track of what the state of that is.
Last thing I have found [2]:
"Sam, Mark and Allen to work on "relationships" and varied
representation in ES6."
David
[1]
http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes
[2]
https://github.com/rwaldron/tc39-notes/blob/master/es6/2013-03/mar-13.md#conclusionresolution-1
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss