I used setX only to show that the value can be set with a method. The scope for ro names could be the same as for private names. Btw, are private names still in? I couldn't find them in the html version of the latest draft.
On Fri, Dec 13, 2013 at 8:19 PM, Andrea Giammarchi < [email protected]> wrote: > the closer/best option would be probably this one: > > ```javascript > function Obj() { > var xValue = 2; > Object.defineProperties(this, { > x: { > enumerable: true, > configurable: false, > get: function x() { > return xValue; > }, > set: function x(value) { > throw 'not allowed'; > } > }, > setX: { > enumerable: true, > configurable: false, > writable: false, > value: function setX(value) { > xValue = value; > } > } > }); > } > ``` > > However, this patter stinks for many reasons: > > 1. bad performance per each object initialization, avoid if you need > to create many Obj instances > 2. it's unclear why the `setX()` is better than just using the setter > ... you have a public directly accessible property but you want a method to > set its value ... you are not making its value settable only privatly, you > are exposing the possibility so you gain nothing in terms of "security" > > Best Regards > > > > > > On Fri, Dec 13, 2013 at 8:48 AM, raul mihaila <[email protected]>wrote: > >> @Jeremy: something similar could be achieved with a private name (I want >> object properties) and accessor properties, but it lacks the advantages >> that I mentioned (also outside classes and object literals, the accessor >> properties are ugly). >> @Claude: that's not easy to use, and also it can be done outside the >> execution context. >> >> >> On Fri, Dec 13, 2013 at 6:20 PM, Claude Pache <[email protected]>wrote: >> >>> >>> If you are not paranoid, you can just use nonwritable properties. That >>> forces you to use `Object.defineProperty` to change the value, so you are >>> protected against accidental assignments. >>> >>> function Obj() { >>> Object.defineProperty(this, 'x', { value: 2, writable: false, >>> enumerable: true, configurable: true }) >>> this.setX = function (val) { >>> Object.defineProperty(this, 'x', { value: val }) >>> } >>> } >>> >>> o = new Obj >>> o.x = 17 // assignment will fail; moreover, in strict mode, an error >>> is thrown >>> o.x // 2 >>> o.setX(18) >>> o.x // 18 >>> >>> It doesn't prevent the user from hanging themself with >>> `Object.defineProperty(o, 'x', { value: 17 })`; but at least, it won't be >>> by chance! >>> >>> —Claude >>> >>> >>> Le 13 déc. 2013 à 14:34, raul mihaila <[email protected]> a écrit : >>> >>> Hello, was there any proposal for object properties that can be read >>> from anywhere but are writable only from the execution context where the >>> name associated with the property was defined? Something like: >>> >>> function Obj() { >>> ro x; // read only name x >>> this.x = 2; >>> this.setX = function (val) { >>> this.x = val; >>> }; >>> } >>> >>> var o = new Obj; >>> >>> o.x; // 2 >>> o.x = 43; // throws some error >>> o.x; // 2 >>> o.setX(100); >>> o.x; // 100 >>> >>> The advantages would be that you are sure that there are no side effects >>> when the property is accessed and also I'm guessing you have no function >>> call overhead. >>> _______________________________________________ >>> es-discuss mailing list >>> [email protected] >>> https://mail.mozilla.org/listinfo/es-discuss >>> >>> >>> >> >> _______________________________________________ >> es-discuss mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/es-discuss >> >> >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

