3

オブジェクトの一部として定義されている現在の関数名を取得する方法はありますか? スタンドアロン関数の関数名を取得するこの方法があることは知っています。

関数定義:

function funName(){}

関数名を取得:

var myName = arguments.callee.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));

しかし、次のように定義されている場合、どうすれば取得できますか:

myobj.prototype.funcName = function(){}

ありがとう。

4

2 に答える 2

3

匿名関数を使用しているため、頭に浮かぶ唯一のアイデアは、ヘルパー関数のようなものを使用することです。

  • ダミーのエラーをスローします
  • それをキャッチ
  • 解析しますstacktrace
  • 解析された情報を含むオブジェクトを返します

デバッグ用の場合、これは適格かもしれませんが、エラーをスローして解析するかどうかがよくわからないため、生産的な環境での使用を控えます。はとても良い考えです。

ああ、メモarguments.calleeとして、それは悪い習慣であり、ECMAScript 5's厳密モードでは禁止されているため、使用しないで
ください。単に関数式に名前を付けることができます

MDN 引数.callee:

注: arguments.callee() の使用を避け、すべての関数 (式) に名前を付けてください。
警告: ECMAScript の第 5 版では、strict モードでの arguments.callee() の使用が禁止されています。

それは私が最初の試行で思いついたことです。最新のものでのみテストしたIE Firefox Chromeので、コードを調整する必要があるかもしれません

var stackTest = function () {
    console.log(getStack(0).fn); //stackTest
}

function getStack(n) {
    var stacks = [];
    try {
        throw new Error("Test")
    } catch (e) {
        var stack = e.stack.split("\n");
        for (var i = 0, j = stack.length; i < j; i++) {
            var current = stack[i].match(/^(?:\s*at? ?)?(.+?)(?:@| )\(?(.*?):[^\/](\d*):?(\d*)?/)
            if (current == null) {
                continue
            }
            var entry = {
                fn: current[1] || "anonymous",
                file: current[2] || "unknown",
                line: ~~current[3],
                column: ~~current[4],
                time: new Date().getTime()
            }
            if ("getStack" !== entry.fn) stacks.push(entry);
        }
    } finally {
        return "number" === typeof n ? stacks[n] : stacks;
    }
}
stackTest();

オブジェクトのプロトタイプ関数を使用した出力例を次に示します。

function test() {}
test.prototype.anotherTest = function () {
    console.log(getStack(0).fn);
  //Chrome:      "test.anotherTest"
  //Firefox:     "test.prototype.anotherTest"
  //IE:          "anotherTest"
}
var instance = new test();
instance.anotherTest();

JSBinの例:

于 2013-03-19T09:07:16.763 に答える
0
for(var k in myobj.prototype){
    console.log(k)

}

于 2013-03-19T07:32:51.767 に答える