Hi David, What does exactly "not be trapped" mean? If you define a property on a proxy object, the defineProperty trap of the handler is the only method with which that operation can succeed. If defineProperty doesn't exist you want us to just ignore the operation?
I think this approach has some pretty several problems. If a programmer writes down 6 of the 7 mandatory traps and forgets one, it will be very hard to debug why the proxy doesn't work as expected. Corresponding operations just disappearing in a black hole is not very intuitive. I am not completely dismissing your concerns. We are using proxies internally in Firefox and most people I have seen use them for the first time make exactly the mistake your code does below: not implement all the mandatory traps. The resulting error messages are not very intuitive, but they are a reflection of the language semantics behind the scene. For some specific reasons Mark can explain better than me the spec doesn't want the implementation to verify the existence of all 7 mandatory traps, so thats not really an option either. We have previously discussed adding standard handlers to the specification, i.e. an NoopHandler and a ForwardingHandler. You can delegate to these from your handler to get the desired default behavior. I think this is the best of the someone poor choices we have. It catches accidental trap omissions, but still allows you to leave them out as long you pick a default behavior (and it doesn't force a specific default behavior down people's throat). Andreas On Jan 21, 2011, at 8:43 AM, Mark S. Miller wrote: > Hi David, I'm forwarding your message to es-discuss as it has no direct > relevance to ES5 per se. > > All, please reply only on es-discuss. > > ---------- Forwarded message ---------- > From: David Bruant <[email protected]> > Date: Fri, Jan 21, 2011 at 3:08 AM > Subject: On ES Harmony proxies extensibility > To: [email protected] > > > Hi, > > Working on writing the MDN doc for ES Harmony proxies > (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Proxy), > I've studied the proxies and would like to provide some feedback. > > My main concern in the proposal (and its current implementation on FF4b9) is > the following sentence: "handler is an object that at minimum implements the > following API" (7 functions). At first, I didn't understand why and then I > have tried the following : > -------- > var p = Proxy.create({get: function(proxy, name) { > return 'Hello '+ name; > } > }); > > Object.defineProperty(p, 'a',{value:1}); > -------- > In FF4b9, this code triggers an error : "defineProperty is not a function". I > interpret this as: the proxy traps the defineProperty call, then calls > handler.defineProperty which is undefined. > It gets a bit more weird when a derived trap is called. If undefined in the > handler, the default behavior is called. This behavior uses one of the > fundamental trap (by definition of "derived trap"). If this fundamental trap > isn't implemented in the handler, an error is thrown about the fundamental > trap which is not very intuitive. This is more of an implementation concern, > but it could be given as an advice for future implementation. > > Since proxies "trap" all traps (fundamental and derived), all fundamental > traps need a handler method. I think that it can be the cause of a problem > for the Proxy standard extensibility: > Let's assume that, at some point, the Proxy proposal gets standardized. It > will have a well-defined set of fundamental traps and of derived traps. > People are going to write applications with them.They are going to implement > the 7 fundamental traps. This is code in the wild. > > Let's assume (and this assumption is the one to discuss, I think) that the > TC-39 comittee wishes to extend the number of fundamental traps with a > fundamental trap 'FT'. This wish won't be able to be fulfilled, because > proxies will be already implemented and used. These proxies handler will > implement the 7 fundamental traps (not the 8th one) and consequently executed > on an ES engine with support of the 8th trap, it will trigger some sort of > error ("FT is not a function") each time the behavior trapped by FT happens. > Potentially breaking existing code, adding FT will be impossible. > > My point is that as soon as Proxies will be standardized, it will become > impossible to add fundamental traps without either breaking existing code or > becoming inconsistent. > > > In my opinion, the extensibility problem is due to the fact that all traps > are trapped by default in proxies regardless if the user wants it or not. > Please allow me an analogy with DOM events. I see proxy traps as "events on > ECMAScript objects". When in the code a "delete" happens, a /delete/ event > happens, it is trapped and the delete handler function is called like a event > handler for a DOMEventListener. > Capturing all events by default and forcing "proxy authors" to implement all > event handlers would be the equivalent to say to web authors "implement > handlers for all DOM events for all DOM node". The scale is different, so it > sounds really ridiculous this way, but the result is the same with the > current proxy default behavior. And as this behavior prevent Proxy extension, > it would prevent addition of new DOMEvent if this had been the chosen model > at the time. > Another problem I see from the proxy author point of view is that proxies as > they are allow some non-intuitive code writing. When I started to write the > handler with just a 'get' method, I expected the proxy to only "capture", > "trap" only "get code" (proxy.property) like a lot of examples (in proxy > presentation slides > (http://www.slideshare.net/BrendanEich/metaprog-5303821) or in Tom Van Cutsem > tutorial (http://soft.vub.ac.be/~tvcutsem/proxies/)) seemed to imply (that's > at least how I was interpreting them). > A potential last problem that goes with trapping everything by default is > performance. If we had the potential to only trap "events" we've registered > for (by explicitely providing a function), other "events" wouldn't be trapped > and thus, there could be no need to check if there is a function, etc. > > In my opinion, the solution to solve the extensibility problem, the > non-intuitive code problem and the potential performance problem would be to > only trap events that have explicitely a function for it. If there is no > function, instead of providing a default behavior, the event could just not > be trapped. > > I am new on this mailing-list. I hope it was the right place to provide this > feedback. > > Thanks for reading, > > David > > _______________________________________________ > es5-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es5-discuss > > > > -- > Cheers, > --MarkM > _______________________________________________ > 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

