I'm looking to make a callable JavaScript object, with an arbitrary prototype chain, but without modifying Function.prototype.
I don't think there's a portable way to do this:
You must either set a function object's [[Prototype]] property or add a [[Call]] property to a regular object. The first one can be done via the non-standard __proto__
property (see olliej's answer), the second one is impossible as far as I know.
The [[Prototype]] can only portably be set during object creation via a constructor function's prototype
property. Unfortunately, as far as I know there's no JavaScript implementation which would allow to temporarily reassign Function.prototype
.