Overwrite toString for specific function

javascript, overloading

Solution

You can define `toString` on the returned function in `callme` by storing it in a variable before returning it:

var obj = {
  callme: function (){
    function toString(){
      return this();
    }

    var f = function (){
      // Dynamically fetch correct string from translations map
      return "call me, maybe"; 
    };

    f.toString = toString;

    return f;
  }
};

var func = obj.callme.bind(obj);
console.log(func);                //=> [Function]
console.log(func());              //=> { [Function] toString: [Function: toString] }
console.log(func().toString());   //=> 'call me, maybe'

Problem

Look edits below! I am currently looking for a way to overload the `toString` method of one specific function that is generated dynamically (returned by function). I know I can overload the `toString` function of `Function.prototype`, but this will overload all `toString` functions of all functions, I want to avoid this. My example function: ``` var obj = { callme: function() { return function() { // Dynamically fetch correct string from translations map return "call me, maybe"; } } } // Binding callme to func, allowing easier access var func = obj.callme.bind(obj); console.log(func, func()) ``` So far I have tried to just treat the function like a regular JavaScript object. ``` func.toString = function() { return this(); } ``` This results in the `Function.prototype.toString` still being called instead of `func.toString`. Trying to access the `func.prototype` is not possible, the `prototype` property is undefined since it is a function not an object. Overwriting `toString` of `Function.prototype` is not an option, changing `func` to an object is also not possible since it might brake compatibility with older parts of the code. Edit: The attempts made above are obviously not working since I am overwriting the `toString` of the function `func` and not the `toString` of the returned function. Now a better question: Is there an elegant way to overwrite the `toString` of all functions that are returned by `func` so that they "share" the same `toString`. (Means I don't have to specify the `toString` for every returned function.)

Original source