Correction: The scope for ro names could be the same as for private names,
except that they can be read from outside.


On Fri, Dec 13, 2013 at 8:39 PM, Andrea Giammarchi <
[email protected]> wrote:

> P.S. I swear I thought this was JSMentors ML ... sorry for that
>
>
> On Fri, Dec 13, 2013 at 10:19 AM, 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

Reply via email to