有没有办法获取函数表达式的构造函数名称?

时间:2014-12-03 01:33:37

标签: javascript

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

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"

当我使用函数表达式时,有没有办法获取构造函数的名称?也许有些黑客?

2 个答案:

答案 0 :(得分:2)

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

或者,您可以使用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

答案 1 :(得分:1)

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

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

您可以自由混合语法

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

但是,在某些较旧的浏览器(特定版本的IE)中不支持此功能,并且仅使用function X() { }就没有没有优势。