2014-12-03 81 views
0

我在我的代码中注意到,当我使用函数表达式时,我无法获取构造函数的名称。有没有办法获得函数表达式的构造函数名称?

var X = function() { /* some code*/ }; 
var foo = new X(); 
console.log(foo.constructor.name); // "" 

,但如果我用一个函数声明,我可以

function X() {/*some code*/} 
var foo = new X(); 
console.log(foo.constructor.name); //"X" 

有没有办法让构造函数的名称,当我使用功能体现在哪里?也许有些黑客?

+3

如果它没有名字,你到底在想借此给?为什么你首先需要它? – 2014-12-03 01:36:32

+0

它有一个名字,它是匿名的 – 2014-12-03 01:37:16

+2

@ChrisCaviness:??? – 2014-12-03 01:38:17

回答

1

如果您没有命名,则无法获取其名称。

请使用function X() { },或者接受您无法为其指定名称。

您可以自由组合的语法

var Y = function X() { }; 
(new Y).constructor.name; // "X" 

但是,这是不是在一些旧的浏览器上简单地使用function X() { }支持(IE的具体版本)和具有没有好处。

+0

好的我认为这样做很有道理,但我只注意到Chrome控制台可以访问变量名,所以我想也许有一个API或黑客可以使用。谢谢 – 2014-12-03 02:00:18

+0

当你有'var x = y = z = function(){}'时,怎么办? – meagar 2014-12-03 02:02:00

+0

请注意,[*函数*对象](http://ecma-international.org/ecma-262/5.1/#sec-15.3.5)的* name *属性不是ECMAScript的标准功能,它只是发生由当前的浏览器实现。 – RobG 2014-12-03 05:53:08

2

当您使用函数表达式时,var Func = function() {...}。该函数被分配给Func变量作为对象引用(函数也是对象)。所以,当你使用new Func()实例化一个实例时,它实际上是类似new (function() {...})amodymod构造函数。这与可变指标无关。这就是为什么你不能得到变量名称。

或者,您可以使用named function expression,这可能有点不同。

var X = function Func() { /* some code*/ }; 
var foo = new X(); 
console.log(foo.constructor.name); // "Func" 

这是在OOP风格JS中非常常用的。又如:

function Obj() {...} 
Obj.prototype.method = function _method() { ... }; 

一个优势,这样做的是,当你调试代码,在破发点,你可以在调用堆栈看到函数名,而不是“anounymous”。这是kangax文章的一个例子。请注意我突出显示的差异。

enter image description here enter image description here

+0

是的,我很熟悉调试和查看调用堆栈,这非常有帮助。我提到它是因为我注意到Chrome控制台可以访问它,但我想这都是内部的。谢谢。我很确定没有我可以访问的API。 – 2014-12-03 02:02:15

+0

@EdgarMartinez更新了我的回答。对你有帮助的帮助:) – Leo 2014-12-03 02:19:07

相关问题