On Wed, Aug 8, 2012 at 1:08 PM, Allen Wirfs-Brock <[email protected]>wrote:
> > On Aug 8, 2012, at 9:32 AM, Rick Waldron wrote: > > > > On Mon, Aug 6, 2012 at 6:44 PM, Allen Wirfs-Brock > <[email protected]>wrote: > >> Based upon discussions last week in the "July 25, 2012 - TC39 Meeting >> Notes" thread, I've created a new strawman proposal for a := operator. See >> http://wiki.ecmascript.org/doku.php?id=strawman:define_properties_operator >> >> >> := is a convient way to copy properties from one object to another or to >> extend an object with new properties. It combines supports for many of the >> same use cases as the previously proposed "object extension literals" and >> the JSFixed Object.extend proposal. >> >> The most important characteristic of := is that it uses >> [[DefineOwnProperty]] semantics rather than [[Put]] semantics to define >> properties on its target object so it doesn't run into issues with >> assignment to accessor properties or over-riding inherited readonly >> properties. It is also smart about dealing with methods that reference >> super. >> >> Some basic examples: >> >> target := src; //define all own properties of src onto target >> >> //add a method and an accessor to an existing prototype >> Point.prototype := { >> plus(aPoint) {return new >> this.comstructor(this.x+aPoint.x,this.y+aPoint.y}, >> get rho() {return Math.sqrt(this.x*this.x+this.y*this.y} >> }; >> >> >> Have at it, >> > > Allen, > > Based on the semantics, specifically 4.I - 4.III, this doesn't work: > > var div = document.createElement("div"); > > // Create a new div that will be hidden > div := { > innerHTML: "<p>P child element that contains a Text node</p>", > id: "my-div", > hidden: true > }; > > > ...This is a pretty major use case that's satisfied by today's "extend" > implementations. > > > The above is an assignment use case, not a definitional use case. For > this you want something that uses [[Put]] semantics like > http://wiki.ecmascript.org/doku.php?id=strawman:batch_assignment_operator. > > There really is a difference between [[Put]] and [[DefineOwnProperty]] > semantics and when we tried to combine them in > http://wiki.ecmascript.org/doku.php?id=strawman:object_extension_literals it > din't work very well. > I'm with you across the board here, frustrations of extension literals and all. > > A key point about := is that devs need to be intentional about whether > they mean [[Put]] or [[DefineOwnProperty]]. They need to think about the > differences and what they are actually trying to do with a specific piece > of code. Part of the motivation of using two similar looking operators is > to encourage devs to think "does this need to be a + or a := ?" > > Currently, the convenience of = relative to the inconvenience of > Object.defineProperty encourages devs to use = when they really intend > [[DefineOwnProperty]] semantics. In some cases this does something other > than was actually intended. > > From your response, I infer we may also need to be concerned that the > convenience of := for "setting" multiple property values may encourage dev > to use := when they really intend =/[[Put]] semantics. > Again, I'm with you in the desire to make [[Put]] and [[DefineOwnProperty]] semantics clearer while also providing a convenient syntax that further promotes the use of defined properties. This all comes back to needing some form of "Object.extend" that behaves the way I explained above. To be clear, I want BOTH := and (not-yet-defined) "object extend" Rick > > Allen > > > > > > > > > > > > > > > > > > I took a crack at implementing your semantics as "Object.extend" to feel > out any issues or "gotchas" and came up with a few. I've posted the impl as > well as a few relevant tests in this gist: > > https://gist.github.com/3296375 > > (NOTE: The super binding is probably wrong or inadequate) > > > I have a feeling that this may be overly complex, but I think > that LeftHandSideExpression accessors should be enforced > unless AssignmentExpression is defining new accessors of the same name. So, > if the AssignmentExpression contains a _data_ property of the same name as > an existing property in the LeftHandSideExpression that is an accessor, > the value of the AssignmentExpression's data property should be assigned, > not defined. > > I hope that makes sense. > > > Rick > > > > > > > >> >> Allen >> >> _______________________________________________ >> 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

