On Sep 24, 2009, at 2:56 PM, Charles Jolley wrote:
Now the question is, how can ClassB.foo() call ClassA.foo() in a generic fashion?

I could force developers to hard code this knowledge (i.e. when implementing ClassB.foo() you have to explicitly call ClassA.foo.apply(this)) but this is prone to developer error and also makes the code not easily transportable from one method to another; violating the sort of "copy-and-paste" ethos that is part of JavaScript.

I've been told that I could name the functions.  e.g.:

ClassB = ClassA.extend({
  foo:  function foo() {
    // ..code
  }
});

Somehow that should solve my problem, though I can't really work out how. But regardless, asking developers to name each method twice in the declaration is also error prone and fragile.

--

The way I solve this currently is to implement extend() so that when it copies an overloaded method, it sets a property ("base") on the Function to point to the Function it is overloading. In the example above, for example, this means that ClassB.foo.base === ClassA.foo.

This way I can write a generic call to "super" like so:

ClassB = ClassA.extend({

  foo: function() {
    arguments.callee.base.apply(this, arguments); // calls super!
    // other code
  }

});


Given your example, a named function expression would do the job trivially:

ClassB = ClassA.extend({

  foo: function foo() {
    foo.base.apply(this, arguments); // calls super!
    // other code
  }

});

It is likely to be both faster and safer than arguments.callee as both arguments and callee can be overridden, and the lookup up for 'foo' is guaranteed.

One other thing to consider is that arguments.callee is only invalid in strict mode -- arguments.callee will continue to work fine in the general case.

--Oliver

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to