On Jul 8, 2011, at 6:03 PM, Brendan Eich wrote: > On Jul 8, 2011, at 5:48 PM, Allen Wirfs-Brock wrote: > >> On Jul 8, 2011, at 5:16 PM, Brendan Eich wrote: >> >>> What's the imperative API for <| (which has the syntactic property that it >>> operators on newborns on the right, and cannot mutate the [[Prototype]] of >>> an object that was already created and perhaps used with its original >>> [[Prototype]] chain)? >> >> Fair point and one I was already thinking about :-) >> >> For regular objects, it is Object.create. >> >> For special built-in object with literal forms, I've previously argument >> that <| can be used to implement an imperative API: >> >> Array.create = function (proto,members) { >> let obj = proto <| {}; >> Object.defineProperties(obj,members); >> return obj; >> } > > And likewise for Function.create and RegExp.create. Boolean, Number, String, > and Date get nothing :-P.
Actually in the <| proposal I define it to work with boolean, number, and string literals on the LHS. Sorta useless but I included them so the complete set of literals was covered. So it really is only Date that didn't get invited to the party. > > We have a somewhat-troubled proposal in Harmony to make Function.create an > alternative Function constructor that takes a leading name parameter, and > then parameters and body string parameters. But perhaps that could be renamed > Function.createNamed. I think that create methods on Constructors should generally follow the argument pattern of Object.create. Things that don't should get a different name. > > >> Basically, <| is sorta half imperative operator, half declaration component. >> >> This may be good enough. It would be nice it it was and we didn't have to >> have additional procedural APIs for constructing instances of the built-ins. >> Somebody has already pointed out <| won't work for built-in Date objects >> because they lack a literal form. I think the best solution for that is to >> actually reify access to a Date object's timevalue by making it a private >> named property. > > That is an old idea I've brought up from time to time. If that private name > were exported, you could even make useful Date subclasses (rather than Date > instances that have extended proto chains). > > >> BTW, way did ES1(?) worry about allowing for alternative internal timevalue >> representations? If in really there really any perf issues that involve >> whether or not the timevalue is represented as a double or something else? > > The extrapolated Gregorian calendar's range in milliseconds was chosen > carefully to fit in an IEEE 754 double without loss of precision. > > Real implementations decode the double into commonly-accessed fields that > would have to track any updates to the milliseconds since (negative for > before) the epoch. Seems like this could be an invisible implementation detail. An it is really worth the effort. How often does anybody set Date components in a situation that is so time critical that this would matter. (any shouldn't dates be immutable...oh well) Allen _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss