查看以下内容编辑!
我目前正在寻找一种方法来重载一个动态生成的特定函数的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
。)
答案 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";}