2012-10-21 52 views
2

想象一個JavaScript「類」 Foo確定JavaScript對象實例的類的名稱

var Foo = function() 
{ 
}; 

而那類的一個實例:

var foo = new Foo(); 

我可以從實例中獲得的字符串Foo直接fooFoo只是一個傳遞變量,在實例化後無法與實例foo關聯?


EDIT 1SLaks suggests使用foo.constructor。這給:如果函數的形式定義

function() 
{ 
} 

這種方法的工作原理:

function Foo() 
{} 

...但是這可能並不總是如此。


EDIT 2試圖skizeey's approach也不起作用。它本質上是一個比較完整的嘗試,作爲疏鬆的方法,但產生一個空字符串:""


編輯3我不知道這是否是實際上可能以某種方式。請注意,從Chrome的JavaScript控制檯下面的成績單:

> var Foo = function() {} 
undefined 
> var foo = new Foo(); 
undefined 
> foo 
Foo 

在最後一行,鉻清楚的知道,對象是Foo類型。然而,這可能只是一個Chrome的東西,而不是標準的JavaScript,甚至是語言本身無法訪問的東西。

+0

你真的需要字符串' 「富」'?你最終想做什麼? –

+0

我想在我的代碼中利用慣例。我使用的是RequireJS,知道這個名字意味着我會知道該類是在哪個模塊中定義的,所以我可以在從本地存儲中重新調用數據時再次加載它。 –

+0

如果您控制所需模塊中的構造函數,您可能只需要輸入名稱。如果您不這樣做,那麼您是否希望將數據與其原始原型鏈重新關聯?還是僅僅知道要加載哪些模塊? –

回答

4

使用命名功能:

> var Foo = function Foo(){}; 
> undefined 
> var foo = new Foo(); 
> undefined 
> foo.constructor.name 
> "Foo" 

隨着匿名函數:

> var Foo = function(){}; 
> undefined 
> var foo = new Foo(); 
> undefined 
> foo.constructor.name 
> "" 
0

您可以從foo.constructor獲得Foo功能。
但是,您不能將該函數實例與您分配給它的變量的名稱關聯。

+1

除非您覆蓋構造函數屬性。 – clentfort

+0

在這種情況下,你不能這樣做。看我的編輯。 –

0

another thread

var getName = function(object) { 
    var funcNameRegex = /function (.{1,})\(/; 
    var results = (funcNameRegex).exec(object.constructor.toString()); 
    return (results && results.length > 1) ? results[1] : ""; 
}; 

你基本上就可以抓取整個構造爲一個字符串,然後提取它的名字。

雖然有一點需要注意:就像在SLaks的回答評論中說的那樣,沒有人會阻止任何人覆蓋對象的構造函數屬性。

另一個警告:你也必須明確命名你的功能。

+0

這也不起作用。我進一步編輯了我的問題。 –

+1

編輯我的答案。 –

+0

它仍然無法正常工作。嘗試使用我的問題中的代碼示例。它只是返回一個空字符串。 –

2

在沒有修改模塊代碼的情況下,沒有辦法實現你想要的。

當你這樣定義

var Foo = function() {...} 

函數的功能 - 和任何對象使用它作爲一個構造函數創建的 - 沒有名字Foo的知識。你也可以做var x = 0,然後嘗試獲取值0告訴你名稱x

+0

看看我的第三次編輯。不知何故,Chrome知道類的名稱,即使它不是來自命名函數表達式。我想知道這是否是標準的一部分,或者只是Chrome的炫目特權。 –