2016-08-25 52 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