On Apr 6, 2012, at 2:57 PM, Axel Rauschmayer wrote:

> I was thinking about Allen’s
> 
>     class Sub extends mixin(Jane, Jack, Super) {
>     }
> 
> Which could have the following prototype chain.
> 
>     Sub -> Jane' -> Jack' -> Super.prototype
> 
> A method in a module that works like Prototype’s Object.extend(), but copies 
> private properties should suffice.
> 
> Variations:
> - Copy Jane and Jack into the same object.
> - Use a class declaration to define the mixins Jane and Jack. Then the 
> prototype chain is
>         Sub -> Jane.prototype' -> Jack.prototype' -> Super.prototype

I think there is another approach that doesn't require copying.  Use a proxy to 
define a synthetic prototype object that delegates to one or more mixin 
providers:

    Sub -> synthesized-mixin-delegator-> Super.prototype
                           |                  |
                          V                 V
                      Jane            Jack

This is off-the-cuff so I haven't worked out the details but I think it almost 
works.  I think it will work for string-keyed properties.  Unfortunately, as 
currently specified it won't work for private name properties because the proxy 
traps that would need to do the delegated sideways property lookups are not 
passed the actual private name object.  Instead they are passed a surrogate 
that can be matched against a known private name but which can't be used for a 
direct property access.  There might be ways to fix that which still don't 
expose the  actual private name to misuse.  For example, perhaps a private name 
surrogate could expose a method that does a property lookup using actual 
private name without exposing the actual name. The security focused guys would 
probably have to tell us whether they could live with that additional exposure. 


> 
> Quoting Brendan:
>> Including the private-named properties? That would be bad for integrity: 
>> Alice can't give Bob an object-as-capability where the private names stay 
>> private. Bob can extract them via this hypothetical spread-in-braces and 
>> then abuse them (e.g. to brand a counterfeit object and fool Carol into 
>> thinking it was from Alice).

This has always been my issue with the integrity constraints that have been 
specified for private names.  They really get in the way of the 
meta-programming. You can have a hight integrity or you can have rich 
meta-programming.  It isn't clear to me that you can have both at the same time.
> 
> I don’t see how that can be avoided. One could have two kinds of private 
> names: High-integrity ones and copy-able ones.

That was the rationale behind 
http://wiki.ecmascript.org/doku.php?id=harmony:private_name_objects#possible_visibility_flag
 .  This is something that I pushed quite hard for a while but it didn't seem 
to get a lot of traction.  One reason, that I have kind of given up on it is 
that I don't think many programmer would actually code something like:

const  methodName = name.create("printName",true);

to define their meta programmable private names.

However, if we support
   private foo;   //pretty much means: const foo=name.create("foo")

then maybe it wouldn't be such a leap to also support:
   protected bar;  //pretty much means: const bar-name.create("bar",true)

In other words, protected gives you a private name that doesn't have the 
integrity constraints.  This is actually not an unreasonable understanding of 
"protected" in the contest of a meta-programable dynamic object system.


Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to