General comments response (was Re: ES6 Rev13 Review: MOP-refactoring, symbols, proxies, Reflect module)

Brandon Benvie brandon at brandonbenvie.com
Sun Dec 30 14:57:14 PST 2012


Wouldn't it be possible to make a copy of the provided descriptor object
and otherwise work the same as it is currently specified? This retains the
ability to set and get custom descriptor attributes without making the
stored record mutable, which seems like the primary concern.

On Sun, Dec 30, 2012 at 5:13 PM, Allen Wirfs-Brock <allen at wirfs-brock.com>wrote:
>
> > * I'm a bit uncomfortable with the removal of property descriptor
> normalization in the getOwnPropertyDescriptor/defineProperty traps.
> Especially for getOwnPropertyDescriptor I think it's a breaking change
> w.r.t. ES5.1.
>
> To summarize, the [[GetOwnProperty]] internal method of proxy objects is
> now (in the spec draft) specified to take the descriptor object returned
> from the  getOwnPropertyDescriptor trap and to package it up as an internal
> property descriptor record that is populated in the normal manner from the
> descriptor object.  The process of creating this PD record performs the
> same error checks that are performed (in ES5.1) by
> Object.defineOwnProperty.  In addition, the PD record now captures a
> reference to the original descriptor object.  If that PD record is
> subsequently used in a context where a descriptor object is required, the
> original captured descriptor object is used.  This is essential for
> expressing the semantics of Object.getOwnPropertyDescriptor in terms of the
> MOP while still enabling Proxies to extend of domain of property
> attributes.  Object.getOwnPropertyDescriptor(obj) calls [[GetOwnProperty]]
> on obj which yields a PD record.  It then calls the abstraction operation Fr
> omPropertyDescriptor to produce the descriptor object that is its return
> value.  If obj is an ordinary object, the PD record produced by ordinary
> [[GetOwnProperty]] does not have a captured descriptor object so
> FromPropertyDescriptor cons up a new descriptor object that is a direct
> reflection of the PD record.  If obj is a proxy then [[GetOwnProperty]]
> will return a PD record that captures the descriptor object that was
> returned by the trap.  FromPropertyDescriptor simply returns that captured
> descriptor object which becomes the value of the original
> Object.getOwnPropertyDescriptor call.
>
> This permits things like:
>
> Object.defineOwnProperty(pObj1,"foo", {method: func});  //define property
> on a proxy-based object, that have "method" properties
> console.log (Object.getOwnPropertyDescriptor(pObj1,"foo").method);    //we
> can retrieve the value of the method attribute (if the proxy supports it)
>
> Object.defineOwnProperty(pObj2,"foo",Object.getOwnProperty(pObj1, "foo"));
>  //copy a method properry from pObj1 to pObj2
>
> If descriptor object with extended attributes is applied to an ordinary
> object, it is always first internally converted to a PD record.  PD records
> only contain fields for the ordinary attributes, and any operations upon
> ordinary objects will have no visibility  of  the extended attributes.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20121230/1685f57f/attachment.html>


More information about the es-discuss mailing list