Moreover, should a Proxy really have a prototype ?
I mean, what’s the point about having a prototype, since the “get” method can 
return everything you would like for any property ?

I think getProtototypeOf should be defined as a new trap. And its default 
behaviour should be to return null (or Object.prototype, but I think null is 
the intented behavior of a proxy).

On the other hand, overriding getPropertyNames should not be allowed. 
getPropertyNames should *always* return the concatenation of the properties 
returned by getOwnPropertyNames() and by 
getPrototypeOf(this).getPropertyNames(). It makes no sense otherwhise. 

I understand that we may want to redefine the way an ECMAScript Object can 
handle the native commands, but I’m strongly against anything that can conduce 
to illogical results (if there’s not an use case that justify it, naturally). 
The definition of getPropertyNames is clear and being able to redefine it 
locally seems me wrong. A proxy can modify is own behavior, not the behavior of 
the ES engine. Being able to have getPropertyNames and getOwnPropertyNames 
returning incompatible results is somewhat hurting me. Is there any reason we 
should allow that ? Any use case ?

I’m issuing the same concerns for the “has” trap. It think it should not be a 
trap. It should always return hasOwn(key) || prototype.has(key). Each one of 
hasOwn and prototype can be tuned by the proxy, but not the “has” itself. We’re 
not removing features, but we prevent bad usage of it. Whatever the user code 
do, the ‘has’ behavior will stay logical.

Another thing I don’t quite understand is the difference between “keys” and 
“enumerate”. If there’s no strong difference, it should be the same trap (same 
logic: enumerate should return the concatenation of this.keys and 
this.prototype.keys). Having two different but similar traps will cause 
confusion. Maybe there’s a need for this difference however. I just didn’t 
understand why such a difference should exist, but at least I see more possible 
usages than the first three traps I “contested”. 

Anyway, if we should retain only one thing from the discussions we already have 
seen on the Proxy hub, is that it’s a great feature, but one that still needs 
some work before implementation ;-)

Regards,
François

From: David Bruant 
Sent: Sunday, January 23, 2011 4:24 PM
To: es-discuss 
Cc: Mark S. Miller 
Subject: [ES Harmony Proxies] Fundamental trap definition

Hi,

I am wondering if getPropertyDescriptor and getPropertyNames fundamental traps 
shouldn't rather be derived traps since they could have a pretty 
straightforward default implementation.
One implementation of getPropertyNames could be :
-------------------------- 
Object.getPropertyNames = function(o){
    var objectToInspect;
    var result = [];

    for(objectToInspect = o; 
        objectToInspect !== null; 
        objectToInspect = Object.getPrototypeOf(objectToInspect))
    {
            result = 
result.concat(Object.getOwnPropertyNames(objectToInspect)); 
    }

    return result.removeDuplicates(); // the removeDuplicates method is made 
up, but you get the point
}
--------------------------
This seem to fit the proposal 
(http://wiki.ecmascript.org/doku.php?id=harmony:extended_object_api&s=getpropertydescriptor)
 expectations). This could be also the default getPropertyNames trap 
implementation.

I haven't really seen a strong definition of what fundamental traps are in the 
proposal. On Mark Miller's e-mail 
(https://mail.mozilla.org/pipermail/es-discuss/2011-January/012601.html) is 
written:
[a trap is fundamental if] there is no coherent default behavior to fall back 
to that would be defined in terms of the remaining traps. (please tell me if I 
misinterpret what you meant)
If we're going with this definition, then getPropertyDescriptor and 
getPropertyNames should probably be derived traps since they can clearly be 
defined thanks to other traps (respectively getOwnPropertyDescriptor and 
getOwnPropertyNames as I showed above) which seems to be coherent fallback 
behavior.
Instead of a formal definition, this could be a rational for deciding what is a 
fundamental trap and what isn't.

In the 5 remaining traps (getOwnPropertyDescriptor, getOwnPropertyNames, 
defineProperty, delete, fix), I don't see any that could be defined thanks to 
the others. They seem to be also the fundamental actions that one can perform 
on a single object:
Property-wise:
- create/configure a property (defineProperty)
- delete a property (delete)
- retrieve a property (getOwnPropertyDescriptor. Can be used to separate the 
create and configure cases of defineProperty)
Property-set-wise:
- retrieve the property set (getOwnPropertyNames. More can be found later on 
each property with getOwnPropertyDescriptor)
- prevent further extension (and optional reconfigurations for seal and 
freeze)(fix)
The prototype can be retrieved thanks to Object.getPrototypeOf (which cannot be 
trapped for consistency purposes) and all actions can be performed by climbing 
the prototype chain.

Any thoughts on the fundamental trap definition?
Or on the idea of turning getPropertyDescriptor and getPropertyNames into 
derived traps with the suggested definition?

David



--------------------------------------------------------------------------------
_______________________________________________
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