[英]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.