On Sat, Dec 20, 2014 at 10:41 PM, Gary Guo <nbdd0...@hotmail.com> wrote:
> Oops, mistakes found. I just ignored the fact that in this particular way the 
> Symbol can be retrieved. It seems impossible to have an idea of private 
> symbol in this way. In the case, I think the language can provide a way to 
> distinguish whether an object is created directly by a class/constructor. It 
> seems that there will be no way to prevent that unless the language ensures 
> this.
>
> For example, Add a well-known Symbol @@constructor, and when constructing an 
> object, make sure any objects have a property @@constructor and has the 
> descriptor {enumerable:false, configurable:false, writable: false, value: 
> *The constructor that actually creates the object*}

Hostile code can just grab that well-known symbol and brand their own
objects with it, indistinguishably from the language.

There are ways around this, too - create your own Symbol, keep it
closure-private to the class, so it doesn't escape the class's
methods.  Have the constructor take an extra argument that must be
equal to this symbol; if it's not, the constructor instead calls
itself, passing all of its arguments through and adding the special
identity Symbol, and just returns that.  That way you know that your
"this" object is definitely a fresh language-created one, and you're
definitely being called as a constructor, not as a function invoked on
some arbitrary object.

~TJ
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to