如何获取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"
等。 所以没有机会直接从对象中获取它。
谢谢!
如果你想记录每个函数,如果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);
};
})();
}
}
这是一个匿名函数,它没有名字,因此你现在无法得到它。
如果你已经声明这样:
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