簡體   English   中英

有沒有一種方法來獲取函數表達式的構造函數名稱?

[英]Is there a way to get the constructor name of a function expression?

我在代碼中注意到,使用函數表達式時無法獲取構造函數的名稱。

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"

使用函數表達式時,有沒有一種方法可以獲取構造函數的名稱? 也許有些駭客?

使用函數表達式時, var Func = function() {...} 該函數被分配給Func變量作為對象引用(函數也是對象)。 因此,當您使用new Func()實例化一個實例時,它實際上就像是一個不祥的構造new (function() {...}) 與變量指示器無關。 這就是為什么您無法獲取變量名稱的原因。

另外,您可以使用命名函數表達式 ,但是可能有所不同。

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() { ... };

這樣做的優點之一是,在調試代碼時,在斷點處您可以在調用堆棧中看到函數名稱,而不是“異常”。 這是kangax文章中的一個示例。 請注意我強調的區別。

在此處輸入圖片說明在此處輸入圖片說明

如果不命名,則無法獲取其名稱。

使用function X() { } ,或者接受您不能為其分配名稱的想法。

您可以自由地混合語法

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

但這在某些較舊的瀏覽器(特定版本的IE)中不受支持,並且與僅使用function X() { } 無關

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM