Thanks, 
Please file a bug on this at bug.ecmascript.org 

AllenOn Jan 30, 2015 8:41 PM, Leon Arnott <[email protected]> wrote:
>
> Lately I've been puzzled about what the Proxy "enumerate" trap is supposed to 
> accomplish w/r/t enumeration over prototype properties. Consider the 
> following:
> ```
>   let obj = {"actual-property":1};
>  
>   let proxy = new Proxy(obj, {*enumerate(){
>     yield "falsified-property";
>   }});
> ```
> The implication of the above is that all for-in loops run on the proxy will 
> always produce "falsified-property" and never "actual-property":
> ```
>   for (i in proxy) {
>     console.log(i); // Logs "falsified-property"
>   }
> ```
> However, this proxy behaviour can be easily bypassed by just adding 
> Object.create():
> ```
>   for (i in Object.create(proxy)) {
>     console.log(i); // Logs "actual-property"
>   }
> ```
> When for-in is performed on an inheritor of a proxy, the proxy's "enumerate" 
> trap is never hit at all. This seems undesirable - I think it's intuitive 
> that since enumeration is a prototype-traversing operation, it should also 
> respect prototypes' traps. And, of course, that adding an empty ordinary 
> object to the head of the prototype chain shouldn't dramatically alter the 
> results of a for-in performed on that chain.
>
> As far as I know, this enumerate trap prototype behaviour is unique among 
> traps: the other three traps that explicitly deal with prototype properties - 
> "get", "set" and "has" - are specced to have their traps triggered by 
> operations performed on ordinary object inheritors of them.
>
> The reason for this is, of course, due to how Ordinary Object [[Enumerate]] 
> is currently specced, compared to Ordinary Object [[Get]], [[Set]] and 
> [[Has]]. [[Enumerate]] is required to process properties from prototypes of 
> the object, but is *not* required to call the prototype's [[Enumerate]] as 
> the means of accessing them. (In fact, the informative algorithm provided 
> calls the prototype's [[OwnPropertyKeys]] instead.)
>
> That being said, I want to ask:
>  * Is there a reason or requirement that enumerate traps only trigger when 
> for-in operations are performed on the proxy directly?
>  * Could Ordinary Object [[Enumerate]] be changed to, at the least, require 
> prototypes' [[Enumerate]] be used to retrieve their properties, rather than 
> any method that would ignore it?
>
> Thanks.
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to