如何获取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 );
},
};
这将允许我简单地将对象vardebug
定义为一个函数名,并且只记录这一部分
唯一的问题是:如何获得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在中间中断……好吧,让它在对象内部工作。谢谢-标记为解决方案。