2014-12-03 109 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

相關問題