如何获取javascript对象方法名?

如何获取javascript对象方法名?,javascript,Javascript,我目前正在构建一个更大的对象,需要更快、更具体地调试/检查值/结果/返回 现在我想到了以下几点: var myObject = { whatever: null, whereever: null, debug: false, someFunction: function( arg ) { // General - would output *all* logs for all object functions. // if ( t

我目前正在构建一个更大的对象,需要更快、更具体地调试/检查值/结果/返回

现在我想到了以下几点:

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)返回未定义的
如果我查看整个对象的日志,就会看到
prototype.name=“Empty”
等等。所以没有机会直接从物体中取出


谢谢

这是一个匿名函数,它没有名字,因此您现在无法访问它

如果您这样声明:

someFunction: function iNowHaveAName( arg )
根据您所在的浏览器,您可以通过不同的方式获取该名称

在支持它的浏览器中,可以使用
参数.callee.name
。(这是一款快速且无性能限制的产品)

在不存在异常的浏览器中,您可以捕获异常并在stacktrace中找到它:

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没有任何方法允许您请求对特定对象(包括函数)的所有引用。

如果
debug
true
并且
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);
      };
    })();
  }
}

一般来说,如果debug为
true
,那么当执行任何
myObject
函数时,您希望在控制台上记录一条带有函数名+参数的消息?@dzejkej不完全正确。如果我将
debug
设置为函数名,则只会触发同名fn的
log
。这将允许我将调试构建到每个函数中,并仅在需要/指定时触发它。我的答案包含符合您要求的代码,无需任何硬编码。它有点太高级了,但希望它能激励你学习这门有趣的语言:P.我读到你刚刚开始学习JS,并且意识到这对新的人来说可能是高级的。我希望我没有冒犯你:)。变量x=y,a=b与变量x=y相同;var a=b与var x,a相同;x=y;a=b。只是变量声明和赋值。JS确实很有趣;)。JS很小但很灵活,大部分肉都在里面。分析-以下是和的一些链接。这是一段关于Chrome更新产品的精彩视频。请注意,
arguments.callee
已被弃用,并将在未来的JavaScript版本中删除。它在ES5严格模式下已经不可用。我只是从JS开始,所以我不知道我可以这样命名它们:
someFunction:function iNowHaveAName
。谢谢+1还有一种比回溯更好的获取名称的方法:
function getName(f){var match=/function(\w+)/.exec(f+);return match&&match[1];}
谢谢你的函数。问题(我猜)是我的对象与GooGel.Max一起工作,所以这会破坏一切,因为LATNG在中间中断……好吧,让它在对象内部工作。谢谢-标记为解决方案。