覆盖特定功能的toString

时间:2012-10-26 12:54:43

标签: javascript overloading

查看以下内容编辑! 我目前正在寻找一种方法来重载一个动态生成的特定函数的toString方法(由函数返回)。我知道我可以重载toString的{​​{1}}函数,但这会超载 所有函数的所有 Function.prototype函数,我想要为了避免这种情况。

我的示例功能:

toString

到目前为止,我已经尝试将该函数视为常规JavaScript对象。

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())

这导致仍然调用func.toString = function() { return this(); } 而不是Function.prototype.toString

尝试访问func.toString是不可能的,func.prototype属性未定义,因为它是一个函数而不是一个对象。 覆盖prototype toString不是一个选项,将Function.prototype更改为对象也是不可能的,因为它可能会破坏与代码的旧部分的兼容性。

编辑:上面的尝试显然无效,因为我覆盖了函数func的{​​{1}}而不是返回函数的toString 。现在这是一个更好的问题:是否有一种优雅的方法来覆盖func返回的所有函数的toString,以便它们“共享”相同的toString。 (意味着我不必为每个返回的函数指定func。)

2 个答案:

答案 0 :(得分:2)

您可以在toString中的返回函数上定义callme,方法是在返回之前将其存储在变量中:

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'

答案 1 :(得分:0)

如果您需要自定义值,则无法为此编写方法,而不是尝试覆盖toString原型。

否则,如果您需要更改它,您可以执行以下操作:

String.prototype.toString = function() {return this+"test";}