2016-08-25 55 views
0

我想獲得一個JavaScript實例或類方法的名稱(在客戶端/瀏覽器JS),而使用以下OOP風格AMD模塊(用於RequireJS使用):如何從方法內部獲取JavaScript類/實例方法的名稱?

define([...], function(...) { 
    var FooBar = function() { 
    //Constructor code... 
    }; 

    FooBar.foo = function() { 
    //This is a FooBar class method named "foo". How do I get its name from here? 
    //... 
    }; 

    FooBar.prototype.bar = function() { 
    //This is a FooBar instance method named "bar". How do I get its name from here? 
    //... 
    }; 
}); 

我已經看到各種帖子解釋如何在命名函數(例如,函數foobar(){...})的情況下做到這一點,但不是在指定匿名函數的情況下,例如foobar = function(){...}。

後者與此處相關,除非上述內容可以改爲使用命名函數來代替。

我寧願不回覆到一些命名方案的約定,如foobar = function foobar_extra_name(){...},因爲這涉及命名一個函數兩次。此外,即使這是可能的,仍然不可能像FooBar.prototype.bar = function FooBar.prototype.bar(){...}這樣做,因爲它是點符號,所以它不會是很多幫助。

對此有何想法?任何幫助是極大的讚賞。

+1

究竟什麼是你的使用情況?在最簡單的情況下,你不需要「獲取」這個名字,因爲你知道這個名字是「foo」。 – Bergi

+1

匿名函數沒有名字。如果將相同的功能分配給兩個不同的屬性,您認爲會發生什麼? – Bergi

+0

@Bergi:用例是一種情況,我希望在函數中顯示一條錯誤消息以進行調試,而無需在控制檯中手動擴展堆棧跟蹤。快速打印功能名稱就足夠了。我只是想知道是否有某種機制可以做到這一點(我不想在函數中重複該名稱,因爲我想避免重複揮發性信息,以防我會更改函數名稱)。但是當談到你的第二條評論時你是對的;我只是希望函數被調用的方式會提供一些額外的信息。 – Danny

回答

0

可以使用命名功能,因爲它遵循確實重寫代碼:

var FooBar = function FooBar() { 
    //Constructor code... 
}; 

FooBar.foo = function foo() { 
    //This is a FooBar class method named "foo". How do I get its name from here? 
    //... 
}; 

FooBar.prototype.bar = function bar() { 
    //This is a FooBar instance method named "bar". How do I get its name from here? 
    //... 
}; 
+0

也看看這個答案,看看你如何訪問函數名http://stackoverflow.com/a/17923727/4963159 –

+1

我知道這是可能的,但正如我所說:「我寧願不恢復到一些命名方案的約定,如foobar = function foobar_extra_name(){...},因爲這涉及命名一個函數兩次。「 此外,當在函數中使用arguments.callee作爲參數時,在[link](http://stackoverflow.com/a/17923727/4963159)中給出的「functionName(func)」函數不起作用我可以從函數本身得到的函數的唯一引用似乎是arguments.callee,而且,鏈接中提到的這些參數已被棄用)。 – Danny