Lexically Scoped Object Extensions (was About private names)
Andrew Dupont
mozilla at andrewdupont.net
Mon Mar 21 15:07:37 PDT 2011
Erik,
Yes, this is exactly what a framework like Prototype would need. Your code is highly reminiscent of Ruby's proposed "refinements" feature [1], one which is being debated for inclusion in Ruby 2.0. If this could be implemented in a way that avoids the dreaded namespace dragons, then I would lobby hard for a feature like this.
Cheers,
Andrew
[1] http://timelessrepo.com/refinements-in-ruby
On Mar 21, 2011, at 3:13 PM, Erik Arvidsson wrote:
> The thread about using private names is getting a bit unwieldy but I'd
> like to focus on the use case that I have been thinking of as
> "Lexically scoped monkey patching" or "Lexically scoped object
> extensions" instead of focusing on how to use "private names" to fit
> this scenario.
>
> Extending built ins and modifying existing classes to work around bugs
> or to provide a better API is (or was) a common pattern. Today a lot
> of JS library shun this approach due to the risk of conflicts.
>
> Let us assume that you could extend an object in your current lexical
> scope and that such extensions could be imported from a module into
> your current scope.
>
> Given:
>
> {
> function largerThanN(obj, n) {
> return obj.filter(function(item) {
> return item > n;
> }
> }
>
> var a = [0, 1, 2, 3, 4];
> print(largerThanN(a, 2));
> }
>
> Now we would like to make largerThanN to work with Object objects. The
> naïve thing to do is to just to add a filter method to
> Object.prototype. However, this might cause conflicts with other code
> that uses objects. The idea here is that we can do this safely in our
> scope (ignore syntax except that it is important that it can be done
> statically).
>
> {
> extend Object.prototype with {
> filter: function(fun) {
> var retval = {};
> for (var key in this) {
> if (fun(this[key])
> retval[key] = this[key];
> }
> return retval;
> }
> };
>
> function largerThanN(obj, n) {
> return obj.filter(function(item) {
> return item > n;
> }
> }
>
> var a = [0, 1, 2, 3, 4];
> print(largerThanN(a, 2));
> var o = {a: 0, b: 1, c: 2, d: 3, e: 4};
> print(largerThanN(0, 2));
> }
>
> The above use case cannot be solved using private names because
> private names conflict with public names.
>
> Can we agree that this is a use case that we care about and focus on
> this instead of whether private names can or cannot do this?
>
> --
> erik
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
More information about the es-discuss
mailing list