5

以下の編集を見てください! 私は現在、動的に生成される(関数によって返される) 1つの特定の関数の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の上書きtoStringFunction.prototypeオプションでfuncはありません。コードの古い部分との互換性を損なう可能性があるため、オブジェクトに変更することもできません。

編集:返された関数ではなくtoString関数のを上書きしているため、上記の試みは明らかに機能していません。さて、より良い質問です。返されるすべての関数を上書きして、同じを「共有」するための洗練された方法はありますか。(返される関数ごとにを指定する必要がないことを意味します。)functoStringtoStringfunctoStringtoString

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 に答える