另一个javascript函数对象问题-比使用toString()更优雅的方式

另一个javascript函数对象问题-比使用toString()更优雅的方式,javascript,function,syntax,node.js,Javascript,Function,Syntax,Node.js,我转向您,问另一个与Javascript对象相关的问题,到目前为止我还没有找到答案 我知道函数是对象,它们没有名称。相反,变量是对这些对象的引用 > var a = function() { ... console.log('a'); ... }; > a [Function] > typeof(a) 'function' 所有这一切意味着我不能要求函数的名称。我完全同意这一点。但还有另一种情况(将命名函数放入数组中),我对名称感兴趣,很明显它就在那里 > var b

我转向您,问另一个与Javascript对象相关的问题,到目前为止我还没有找到答案

我知道函数是对象,它们没有名称。相反,变量是对这些对象的引用

> var a = function() {
... console.log('a');
... };
> a
[Function]
> typeof(a)
'function'
所有这一切意味着我不能要求函数的名称。我完全同意这一点。但还有另一种情况(将命名函数放入数组中),我对名称感兴趣,很明显它就在那里

> var b = [function myname(){console.log('hi');},];
> b[0]
[Function: myname]
> b[0]();
hi
> typeof(b);
'object'
> typeof(b[0]);
'function'
在后面的例子中,我想知道是否有一种更优雅的方式来询问名称(在本例中为“myname”),然后使用toString()

干杯, 马克

别无选择


您在控制台中看到输出的原因是控制台确实在内部调用了
toString()

这里有一种方法可以使用
函数原型方法提取
函数的名称

Function.prototype.getMyName = function(){
   if (this.name) {
    return this.name;
   }
   var t = this.toString();
   return t.substring(0,t.indexOf('('))
           .replace(/function/i,'')
           .replace(/^\s+|\s+$/,'');
}

var b = [function myname(){console.log('hi');},];
b[0].getMyName(); //=> 'myname'
使用.name访问器

function helloworld() {}
console.log(helloworld.name); // outputs "helloworld"
var hello = function() {} // anonymous function, add a name
console.log(hello.name) // outputs ""
var hello = function hellow() {} //
console.log(hello.name) // outputs "hellow"

在chrome中,console.dir()显示对象的其他属性以帮助您进一步=]

您可以使用name属性


var b=[函数myname(){console.log('hi');}]
console.log(b[0].name);

可能希望对构造函数如何受到某些方法的影响发表评论inheritance@RussCam:不需要
构造函数,我错了。调整了方法,顺便说一句,添加了对实现“name”属性的浏览器的支持。这不仅在IE中不起作用,而且
name
属性也不是任何标准的一部分,因此在将来的webkit/Gecko版本中可能会停止工作。