Luke Hoban (2011-05-18T01:55:27.000Z)
domenic at domenicdenicola.com (2013-12-13T23:11:30.838Z)
The Private Names strawman currently combines a new runtime capability (using both strings and private names as keys in objects) with several new syntactic constructs (private binding declarations, #.id). At the March meeting, I recall there was some support for the idea of separating these two aspects, and exposing the runtime capability also as a library that could be used in 'text/javascript'. I added a comment to the Private Names strawman page to suggest how this could be done. The runtime behavior of the proposal is the same, but in addition, a library function `Object.createPrivateName(name)` is added which provides direct access to the internal CreatePrivateName abstract operation. This allows the use of private names in a more verbose form, but without needing new syntax - similar in spirit to the ES5 `Object.*` operations. Borrowing an example from the current proposal to illustrate: Using 'text/harmony' syntax: function Point(x,y) { private x, y; this.x = x; this.y = y; //... methods that use private x and y properties } var pt = new Point(1,2); Using 'text/javascript' syntax: function Point(x,y) { var _x = Object.createPrivateName("x"); var _y = Object.createPrivateName("y"); this[_x] = x; this[_y] = y; //... methods that use private _x and _y properties } var pt = new Point(1,2); There seem to be several benefits to this: 1. The private name capability can be made available to 'text/javascript' 2. The feature is easily feature-detectable, with a fallback of using '_'-prefixed or similar pseudo-private conventions 3. The core functionality can potentially be agreed upon and implemented in engines earlier than full new syntax
domenic at domenicdenicola.com (2013-12-13T23:08:14.885Z)
The Private Names strawman currently combines a new runtime capability (using both strings and private names as keys in objects) with several new syntactic constructs (private binding declarations, #.id). At the March meeting, I recall there was some support for the idea of separating these two aspects, and exposing the runtime capability also as a library that could be used in 'text/javascript'. I added a comment to the Private Names strawman page to suggest how this could be done. The runtime behavior of the proposal is the same, but in addition, a library function "Object.createPrivteName(name)" is added which provides direct access to the internal CreatePrivateName abstract operation. This allows the use of private names in a more verbose form, but without needing new syntax - similar in spirit to the ES5 Object.* operations. Borrowing an example from the current proposal to illustrate: Using 'text/harmony' syntax: function Point(x,y) { private x, y; this.x = x; this.y = y; //... methods that use private x and y properties } var pt = new Point(1,2); Using 'text/javascript' syntax: function Point(x,y) { var _x = Object.createPrivateName("x"); var _y = Object.createPrivateName("y"); this[_x] = x; this[_y] = y; //... methods that use private _x and _y properties } var pt = new Point(1,2); There seem to be several benefits to this: 1. The private name capability can be made available to 'text/javascript' 2. The feature is easily feature-detectable, with a fallback of using '_'-prefixed or similar pseudo-private conventions 3. The core functionality can potentially be agreed upon and implemented in engines earlier than full new syntax