2012-10-26 92 views
4

請看下面的編輯! 我目前正在尋找一種方法來重載toString方法動態生成的一個特定功能(由函數返回)。我知道我可以超載toString功能Function.prototype,但是這會超載全部toString功能全部功能,我想避免這個。爲特定功能覆蓋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屬性是未定義的,因爲它是一個函數而不是對象。 覆蓋toStringFunction.prototype不是一個選項,將func更改爲一個對象也是不可能的,因爲它可能會制約與舊代碼部分的兼容性。

編輯:以上的企圖顯然不工作,因爲我重寫功能functoString,而不是返回功能的toString。現在有個更好的問題:是否有一種優雅的方式來覆蓋由func返回的所有功能的toString,以便它們「共享」相同的toString。 (意味着我不必指定toString每一個返回的函數。)

+0

奇怪。我正在建議'func.soString ='... –

+4

你能詳細說明它是如何工作的嗎?它似乎在這裏工作:http://jsfiddle.net/AwDbm/ – jrajav

+0

所以你說你不能重寫'func.prototype.toString = function(){}'? – epascarello

回答

2

可以在callme上返回的函數定義toString

否則,如果你需要改變它你可以這樣做

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' 
0

如果你需要一個定製的價值不能你只寫了那,而不是試圖覆蓋原型的toString方法。返回之前通過將其存儲在一個變量

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