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