我在代码中注意到,当我使用函数表达式时,我无法获得构造函数的名称。
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"
当我使用函数表达式时,有没有办法获取构造函数的名称?也许有些黑客?
答案 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文章的一个例子。请注意我突出显示的区别。
答案 1 :(得分:1)
如果您没有为其命名,则无法获得其名称。
使用function X() { }
,或接受您无法为其指定名称。
您可以自由混合语法
var Y = function X() { };
(new Y).constructor.name; // "X"
但是,在某些较旧的浏览器(特定版本的IE)中不支持此功能,并且仅使用function X() { }
就没有没有优势。