I think using WeakMaps is a good idea. Using a Symbol will keep from cluttering 
the namespace with names others might want to use (id,label,etc) and seems more 
consistent than some external means of accessing the id. When I tried defining 
the value before I ran into issues with the prototype chain which is why I was 
using get and a second 'hidden' property. Using WeakMap seems like it'd fix the 
issue.

Can't say I've used Object.assign much - will have to experiment with it.

Thanks,
Michael McGlothlin
Sent from my iPhone

> On Sep 9, 2015, at 7:34 AM, Andrea Giammarchi <andrea.giammar...@gmail.com> 
> wrote:
> 
> Well, to start with, you don't hide symbols, these are all exposed through 
> `Object.getOwnPropertySymbols` or Reflect.ownKeys so for your use case looks 
> like using just a non enumerable property would do as well.
> And btw, even if Symbols don't show up in for/in and Object.keys, these are 
> by default also enumerable so Object.assign will copy them around (reason 
> I've used defineProperty with the value instead of just setting the symbol, 
> so it's non enumerable by default).
> 
> As summary: do you want to be sure that object has a unique "lable" or "id" 
> associated with it? Use WeakMaps, otherwise be prepared to possible clones 
> around if some library uses Object.assign thinking that's a good way to copy 
> properties around.
> 
> I still suggest the Labeler approach that Mark previously indicated.
> 
> Regards
> 
> 
> 
> 
>> On Wed, Sep 9, 2015 at 1:15 PM, Michael McGlothlin 
>> <mike.mcgloth...@gmail.com> wrote:
>> Using frozen objects and such seems a lot more complex to me than just using 
>> a property. Using a symbol to hide the property from cluttering seems to go 
>> along with how other things are being done. And it's my understanding that 
>> other than hiding it that using a Symbol for a name is nothing special - 
>> does it have some negative factor that should make using it less attractive?
>> 
>> 📱 Michael McGlothlin
>> 
>>> On Sep 9, 2015, at 5:36 AM, Andrea Giammarchi <andrea.giammar...@gmail.com> 
>>> wrote:
>>> 
>>> That's similar to the Labeler proposed by Mark, except it needs to search 
>>> for the thing twice (wm.has + wm.get instead of just wm.get which would be  
>>> just fine as check if you count from 1 instead of 0 ;-) )
>>> 
>>> Although I need to understand if you have a wm why wouldn't you just use 
>>> that instead of a Symbol ... so the Labeler seems again a more appropriate 
>>> pattern for this problem.
>>> 
>>> Just my thoughts
>>> 
>>>> On Wed, Sep 9, 2015 at 10:51 AM, Michał Wadas <michalwa...@gmail.com> 
>>>> wrote:
>>>> Following solution will work:
>>>> 
>>>> (function(){
>>>> const wm = new WeakMap();
>>>> Symbol.identity = Symbol( 'Symbol.identity' );
>>>> let i = 0;
>>>> Object.defineProperty(
>>>>   Object.prototype,
>>>>   Symbol.identity,
>>>>   {
>>>>     get: function () {
>>>>       if (wm.has(this)) return wm.get(this);
>>>>       wm.set(this, Symbol(i++));
>>>>       return wm.get(this);
>>>>     }
>>>>   }
>>>> );
>>>> })()
>>>> 
>>>> 
>>>> 2015-09-08 23:29 GMT+02:00 Andrea Giammarchi <andrea.giammar...@gmail.com>:
>>>>> as side note, that's just a lazy assignment that doesn't need two symbols 
>>>>> and a constant get invoke ...
>>>>> 
>>>>> ```js
>>>>> Symbol.identity = Symbol( 'Symbol.identity' );
>>>>> var OBJECT_ID = 0;
>>>>> Object.defineProperty(
>>>>>   Object.prototype,
>>>>>   Symbol.identity,
>>>>>   {
>>>>>     get: function () {
>>>>>       // first time this is invoked ... and no more ...
>>>>>       Object.defineProperty(this, Symbol.identity, {value: ++OBJECT_ID});
>>>>>       // from now own, direct property access \m/
>>>>>       return this[Symbol.identity];
>>>>>     }
>>>>>   }
>>>>> );
>>>>> ```
>>>>> 
>>>>> Regards 
>>>>> 
>>>>>> On Tue, Sep 8, 2015 at 9:57 PM, Michael McGlothlin 
>>>>>> <mike.mcgloth...@gmail.com> wrote:
>>>>>> I try to keep it pretty simple. It's not fancy but the times you want 
>>>>>> fast and dirty information like this are the same times you don't want 
>>>>>> to have to define it manually.
>>>>>> 
>>>>>>  Symbol.identity = Symbol( 'Symbol.identity' );
>>>>>>  const identity = Symbol( 'identity' );
>>>>>>  var OBJECT_ID = 0;
>>>>>>  Object.defineProperty( Object.prototype, Symbol.identity, {
>>>>>>   get: () => {
>>>>>>    if ( !Object.hasOwnProperty.call( this, identity ) ) {
>>>>>>     this[ identity ] = ++OBJECT_ID;
>>>>>>    }
>>>>>>    return this[ identity ];
>>>>>>   }
>>>>>>  } );
>>>>>> 
>>>>>>> On Tue, Sep 8, 2015 at 1:44 PM, Mark S. Miller <erig...@google.com> 
>>>>>>> wrote:
>>>>>>> See Labeler at
>>>>>>> http://wiki.ecmascript.org/doku.php?id=harmony:weak_maps#unique_labeler
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> On Tue, Sep 8, 2015 at 11:16 AM, joe <joe...@gmail.com> wrote:
>>>>>>>> Didn't send to list, something is wrong with my reply all. Sorry about 
>>>>>>>> that. Stupid mobile gmail.
>>>>>>>> 
>>>>>>>> ---------- Forwarded message ----------
>>>>>>>> From: "joe" <joe...@gmail.com>
>>>>>>>> Date: Sep 8, 2015 11:15 AM
>>>>>>>> Subject: Re: Object id, hash, etc?
>>>>>>>> To: "Garrett Smith" <dhtmlkitc...@gmail.com>
>>>>>>>> Cc: 
>>>>>>>> 
>>>>>>>> I agree with this request. This is the logical complement to valueof, 
>>>>>>>> I think. And yes, for most ID use cases this isn't a good fit, but 
>>>>>>>> we're not talking about the general case, just the cases where a 
>>>>>>>> python style id() function *is* appropriate.
>>>>>>>> 
>>>>>>>> Joe
>>>>>>>> 
>>>>>>>>> On Sep 8, 2015 9:08 AM, "Garrett Smith" <dhtmlkitc...@gmail.com> 
>>>>>>>>> wrote:
>>>>>>>>> On 9/8/15, Michael McGlothlin <mike.mcgloth...@gmail.com> wrote:
>>>>>>>>> > Is there a reason not to provide an object id and hash value as 
>>>>>>>>> > other
>>>>>>>>> > languages often do? I find myself defining an identity symbol on 
>>>>>>>>> > objects
>>>>>>>>> > with a value from a simple global counter. It makes it easier to 
>>>>>>>>> > debug if I
>>>>>>>>> > can just look at a log and see what objects and functions were 
>>>>>>>>> > active.
>>>>>>>>> >
>>>>>>>>> > Likewise a hash value would simplify a lot of comparisons and make 
>>>>>>>>> > it easier
>>>>>>>>> > to debug.
>>>>>>>>> >
>>>>>>>>> > I especially find the ID useful when working with bound functions 
>>>>>>>>> > as they
>>>>>>>>> > can be difficult to tell apart. I like to change toString() to 
>>>>>>>>> > provide the
>>>>>>>>> > ID followed by the code (flattened to one line).
>>>>>>>>> >
>>>>>>>>> >
>>>>>>>>> 
>>>>>>>>> NFE's are safe to use where IE8 support isn't needed*.
>>>>>>>>> (function aa(){}).name; // "aa"
>>>>>>>>> 
>>>>>>>>> As for using Object IDs and Object Pooling, lexically-scoped values
>>>>>>>>> have benefits over global ID generators (as your counter). The values
>>>>>>>>> can be passed in as a parameter to the Factory (useful with Private
>>>>>>>>> Proxy). There other benefits to this pattern regarding memory
>>>>>>>>> management and application design. Contact me if you'd like to learn
>>>>>>>>> more.
>>>>>>>>> 
>>>>>>>>> * https://kangax.github.io/nfe/
>>>>>>>>> --
>>>>>>>>> Garrett
>>>>>>>>> @xkit
>>>>>>>>> ChordCycles.wordpress.com
>>>>>>>>> garretts.github.io
>>>>>>>>> personx.tumblr.com
>>>>>>>>> _______________________________________________
>>>>>>>>> es-discuss mailing list
>>>>>>>>> es-discuss@mozilla.org
>>>>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> es-discuss mailing list
>>>>>>>> es-discuss@mozilla.org
>>>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> -- 
>>>>>>>     Cheers,
>>>>>>>     --MarkM
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> es-discuss mailing list
>>>>>>> es-discuss@mozilla.org
>>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> es-discuss mailing list
>>>>>> es-discuss@mozilla.org
>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> es-discuss@mozilla.org
>>>>> https://mail.mozilla.org/listinfo/es-discuss
> 
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to