module name from "@name";
let key = name.create();
function MyClass(privateData) {
    this[key] = privateData;
}
MyClass.prototype = {
    doStuff: function() {
        ... this[key] ...
    }
};

All it does is make the key a special string...
If you get the same string, you can still access the property...
Plus, either you make it non-enumerable so that noone can find the key
which is annoying, or you can find the key with a simple for in
loop...

I'm not sure I understand this proposal...

On Fri, Sep 30, 2011 at 3:55 PM, Dean Landolt <d...@deanlandolt.com> wrote:
>
>
> On Fri, Sep 30, 2011 at 9:50 AM, Xavier MONTILLET <xavierm02....@gmail.com>
> wrote:
>>
>> Hi,
>>
>> I've been playing with getters and setters for a little while and
>> there's one thing really bothering me: You can't store the value in
>> the object in a hidden way. Here is an example:
>>
>> http://jsfiddle.net/xavierm02/UzNK3/13/
>>
>> function Point( x, y ) {
>>    this.x = x;
>>    this.y = y;
>> }
>> Object.defineProperties( Point.prototype, {
>>    x: {
>>        get: function ( ) {
>>            // this would return the stored value
>>        },
>>        set: function ( value ) {
>>             value = parseInt( value );
>>            // and here, you would want to set "this.x" to value but
>> you can't since this would create an infinite loop
>>        }
>>    },
>>    y: {
>>        // same here
>>    }
>> } );
>>
>> You could do it by:
>>
>> - using Object.defineProperties in the constructor and therefore but
>> then, you would have several times the same function created so it
>> kinda sucks.
>>
>> http://jsfiddle.net/xavierm02/UzNK3/14/
>>
>> function Point( x, y ) {
>>    Object.defineProperties( Point.prototype, {
>>        x: {
>>            get: function ( ) {
>>                return x;
>>            },
>>            set: function ( value ) {
>>                x = parseInt( value, 10 );
>>            }
>>        },
>>        y: {
>>            // same here
>>        }
>>    } );
>> }
>>
>> - have some kind of array where you store values and another array
>> where you store the this and let those arrays be accessible only from
>> the methods needing it. Then you would get the index of the instance
>> by doing indexOf( this ) on the array of instances and then you would
>> search for the value at this index. Sucks too.
>>
>> http://jsfiddle.net/xavierm02/UzNK3/15/
>>
>> ( function ( ) {
>>    var instances = [ ],
>>    xs = [ ],
>>    ys = [ ];
>>    function Point( x, y ) {
>>        instances.push( this );
>>        xs.push( x );
>>        ys.push( y );
>>    }
>>    Object.defineProperties( Point.prototype, {
>>        x: {
>>            get: function ( ) {
>>                return xs[ instances.indexOf( this ) ];
>>            },
>>            set: function ( value ) {
>>                xs[ instances.indexOf( this ) ] = parseInt( value );
>>            }
>>        },
>>        y: {
>>            // same here
>>        }
>>    } );
>>    this.Point = Point;
>> } )( );
>>
>> I don't know know what you think of this but these methods really
>> aren't convenient from my point of view...
>>
>> There are potential new features that could allow you to do this too:
>>
>> - private properties but then that would mean giving access to private
>> properties to the methods in the prototype, which would mean that
>> adding a method in the prototype would allow to change the values,
>> which isn't what you want... Even though you could freeze the
>> prototype to avoid it...
>> - I remember thinking of another one but I can't remember which one atm...
>>
>> So here'swhat I propose:
>> - the getter gets a parameter which is the stored value
>> - the setter's return value is set as value for the "private" property
>>
>> Here's an implementation of what I would like having (It sucks sinces
>> it prevents garbage collecting and could easilly be optimized but
>> still works):
>>
>> http://jsfiddle.net/xavierm02/UzNK3/17/
>>
>> Object.defineProperties = ( function ( ) {
>>    var defineProperties = Object.defineProperties;
>>    return function ( object, propertyDescriptors ) {
>>        for ( var name in propertyDescriptors ) {
>>            if ( propertyDescriptors.hasOwnProperty( name ) ) {
>>                ( function ( propertyDescriptor ) {
>>                    var get;
>>                    var set;
>>                    if ( propertyDescriptor.hasOwnProperty( 'get' ) ) {
>>                        get = propertyDescriptor.get;
>>                        propertyDescriptor.get = function ( ) {
>>                            return get.call( this, propertyDescriptor.value
>> );
>>                        };
>>                    }
>>                    if ( propertyDescriptor.hasOwnProperty( 'set' ) ) {
>>                        set = propertyDescriptor.set;
>>                        propertyDescriptor.set = function ( value ) {
>>                            return propertyDescriptor.value =
>> set.call( this, value );
>>                        };
>>                    }
>>                } )( propertyDescriptors[ name ] );
>>            }
>>        }
>>        defineProperties( object, propertyDescriptors );
>>    };
>> } )( );
>>
>> And you would use it that way:
>>
>> http://jsfiddle.net/xavierm02/UzNK3/17/
>>
>> function Point( x, y ) {
>>    this.x = x;
>>    this.y = y;
>> }
>> Object.defineProperties( Point.prototype, {
>>    x: {
>>        get: function ( value ) {
>>            return value;
>>        },
>>        set: function ( value ) {
>>            value = parseInt( value );
>>            return value;
>>        }
>>    },
>>    y: {
>>        // same here
>>    }
>> } );
>>
>> Of course, if it were implemented, it would probably allow setting a
>> defaut setter that woudl simply assign and a a default getter that
>> would simply return the value by putting true instead of the function.
>> Or somthing similar.
>>
>> Of course, for this example, implementing type checking would make it
>> useless.
>> But that really was just a example. Something where it would have a
>> real use is, for example:
>>
>> http://jsfiddle.net/xavierm02/UzNK3/20/
>>
>> // isn't suposed to work
>> // here just for wyntax coloration
>> function WYSIWYGEditor( ) {
>>    Object.defineProperties( this, {
>>        iframe: {
>>            value: document.createElement( 'iframe' ),
>>            configurable: false,
>>            enumerable: true,
>>            writable: false
>>        },
>>        textarea: {
>>            value: document.createElement( 'textarea' ),
>>            configurable: false,
>>            enumerable: true,
>>            writable: false
>>        },
>>        container: {
>>            value: document.createElement( 'div' ),
>>            configurable: false,
>>            enumerable: true,
>>            writable: false
>>        }
>>    } );
>>    Object.defineProperty( this, 'wysiwygField', {
>>        value: this.iframe./* get the container */,
>>        configurable: false,
>>        enumerable: true,
>>        writable: false
>>    } )
>>    this.container.appendChild( iframe );
>> }
>> Object.defineProperties( WYSIWYGEditor.prototype, {
>>    wysiwyg: {
>>        value: true,
>>        configurable: false,
>>        enumerable: true,
>>        get: function ( value ) {// or simply true or somethign
>> similar is shorcuts are implemented
>>            return value
>>        },
>>        set: function ( value ) {
>>            value = !!value;
>>            if ( value ) {
>>                this.wysiwygField.innerHTML = this.textarea.value;
>>                this.container.removeChild( this.textarea );
>>                this.container.appendChild( this.iframe );
>>            } else {
>>                this.textarea.value = this.wysiwygField.innerHTML;
>>                this.container.removeChild( this.iframe );
>>                this.container.appendChild( this.textarea );
>>            }
>>            return value;
>>        }
>>    }
>> } );
>>
>> What do you think?
>
>
> See: http://wiki.ecmascript.org/doku.php?id=harmony:private_name_objects
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to