On Apr 16, 2010, at 12:51 PM, Erik Arvidsson wrote:

On Fri, Apr 16, 2010 at 08:43, Brendan Eich <bren...@mozilla.com> wrote:

ES4 since Waldemar's 1998-era JS2 work was concerned with the problem of versioning APIs implied by (1) greatly, and not just adding properties: deleting and redefining too. ES4 proposed namespaces (like Common Lisp packages, IIRC) as the solution. But namespaces are out for Harmony.

My hope is that we can avoid versioning the object model and instead simply extend certain objects that we effectively "reserve to the implementation" (as ANSI and then ISO C does with certain global names, e.g. __foo and _BAR). Indeed Ajax library developers now generally avoid extending standard prototypes, and it's plausible this best-practice could be extended to the built-in constructor objects too.

These are considered best practices because it breaks in the presence of other code outside your control. There is a reason why Prototype.js is popular. It allows people to write code in a more sane way, using methods that are bound to objects instead of global functions. If we had something like ES4 namespaces without all the issues (one can always dream) I'm sure that this best practice would be reversed.

You're right -- I hear this from lots of developers. Ben Galbraith, for example, says Prototype reduces keystrokes and he's right, keystrokes aggregated over a long time do count. There is a corresponding readability issue.

I was describing things as they are, not as they might be. But we do not have a namespace solution.

However, ES5 *does* allow libraries to bind non-enumerable properties of prototype objects. This is half of the solution, and if the prototype in question is Object.prototype, or perhaps even then if the name is obscure enough, a library might risk breaking object detection on that name in the global object.

Another Harmony idea: http://wiki.ecmascript.org/doku.php?id=strawman:names for unforgeable property names not equated to any string. These cannot collide, and with sugar to let them be used with . (not only in computed property accesses using []), we may have a complete solution for injecting new "names" into standard prototypes without breaking existing code.

/be

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to