如何获取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"等。 所以没有机会直接从对象中获取它。

    谢谢!


    如果你想记录每个函数,如果debugtrue并且如果debug设置为函数的名称,那么只记录该函数,你不必将其硬编码为你的每一个函数。

    你可以做的是动态地重写这个函数。 它有点神奇,但它更加灵活,当你添加更多的功能或改变它们的名字时,你不需要改变任何东西。

    是工作代码。

    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);
          };
        })();
      }
    }
    

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

    如果你已经声明这样:

    someFunction: function iNowHaveAName( arg )
    

    取决于您所使用的浏览器,您将能够以不同的方式获取该名称。

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

    在浏览器中,您不能捕获异常并在堆栈跟踪中找到它:

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

    这是慢和性能明智的昂贵 - 不要在生产代码:)


    如果一个函数没有名字,你不能得到它。 一个匿名函数 - 正是你所拥有的 - 没有名字。 分配一个或多个变量或对象属性来引用函数值并不会给它一个名称。

    考虑这些例子:

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

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

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

    链接地址: http://www.djcxy.com/p/95305.html

    上一篇: How to get javascript object method name?

    下一篇: Does JavaScript Guarantee Object Property Order?