5

看看下面的编辑! 我目前正在寻找一种方法来重载一个动态生成的特定函数toString的方法(由函数返回)。我知道我可以重载 的函数,但这会重载所有函数的所有函数,我想避免这种情况。toStringFunction.prototype toString

我的示例函数:

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

到目前为止,我试图将函数视为常规 JavaScript 对象。

func.toString = function() {
    return this();
}

这导致Function.prototype.toString仍然被调用而不是func.toString.

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

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

4

2 回答 2

3

您可以通过在返回之前将其存储在变量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'
于 2012-10-26T13:12:36.320 回答
0

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

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

String.prototype.toString = function() {return this+"test";}
于 2012-10-26T13:11:19.067 回答