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