如何获取javascript对象方法名称?

时间:2011-12-13 18:14:40

标签: javascript

我正在构建一个更大的对象,需要通过调试/检查值/结果/返回来更快,更具体。

现在我想到了以下内容:

var myObject = {
    whatever: null,
    whereever: null,
    debug: false,

    someFunction: function( arg ) {
        // General - would output *all* logs for all object functions.
        // if ( true === myObject.debug )
        //  console.log( 'FunctionNameHere', arg );

        // More specific - would output *only* the log for the currently targeted function
        if ( 'FunctionName' === myObject.debug )
            console.log( 'FunctionNameHere', arg );
    },
};

这样我就可以简单地将对象var debug定义为一个函数名,只记录这部分。

唯一的问题是:我如何获得FunctionName / someFunction

旁注:

  • console.log( arguments.callee );为我提供了整个功能来源。
  • console.log( arguments.callee.name );返回空。
  • console.log( arguments.callee.toString() );返回空
  • console.log( arguments.caller );返回undefined

如果我查看整个对象的日志,我会看到prototype.name="Empty"等。所以没有机会直接从对象中获取它。

谢谢!

3 个答案:

答案 0 :(得分:3)

如果要在debugtrue并且debug设置为函数名称时要记录每个函数,那么只记录您不需要硬编码的函数进入你的每一个功能。

您可以做的是动态重写该功能。这有点神奇,但它更灵活,你不需要在添加更多功能或更改名称时更改任何内容。

HERE 是工作代码。

for (var key in myObject) {
  // if the keys belongs to object and it is a function
  if (myObject.hasOwnProperty(key) && (typeof myObject[key] === 'function')) {
    // overwrite this function
    myObject[key] = (function() {
      // save the previous function
      var functionName = key, functionCode = myObject[functionName];
      // return new function that will write log message and run the saved function
      return function() {
        if (myObject.debug === true || myObject.debug === functionName) {
          console.log('I am function ' + functionName, ' with arguments: ', arguments);
        }
        functionCode(arguments);
      };
    })();
  }
}

答案 1 :(得分:1)

这是一个匿名函数,它没有名称,因此你现在无法实现它。

如果你这样宣布:

someFunction: function iNowHaveAName( arg )

根据您所使用的浏览器,您可以通过不同的方式获取名称。

在支持它的浏览器中,您可以使用arguments.callee.name。 (这是快速且性能明智的免费)

在没有的浏览器中,您可以捕获异常并在堆栈跟踪中找到它:

try {
 i.dont.exist+=1;
}
catch(e) {
//play with the stacktrace here
}

这很慢且性能明显昂贵 - 请勿在生产代码中执行此操作:)

答案 2 :(得分:0)

如果某个功能没有名称,则无法获取该功能。一个匿名函数 - 这正是你所拥有的 - 没有名字。分配一个或多个变量或对象属性以引用函数值不会为其命名。

请考虑以下示例:

var a = [function(){}];
var b = a;
var c = a[0];

该单一功能的“名称”是什么? a[0]b[0]c?为什么要选择一个呢?

JavaScript没有任何方法允许您请求对特定对象(包括函数)的所有引用。