想象一下JavaScript“class”Foo
:
var Foo = function()
{
};
该类的一个实例:
var foo = new Foo();
我可以直接从实例Foo
获取字符串foo
,还是Foo
只是在实例化后无法与实例foo
关联的传递变量?< / p>
foo.constructor
编辑1 SLaks suggests。这给出了:
function ()
{
}
如果函数以以下形式定义,则此方法有效:
function Foo()
{}
......但情况可能并非总是如此。
编辑2 尝试skizeey's approach也不起作用。它本质上是一个更完整的尝试,作为Slack的方法,但产生一个空字符串:""
编辑3 我想知道这是否真的有可能。请注意Chrome的JavaScript控制台中的以下记录:
> var Foo = function() {}
undefined
> var foo = new Foo();
undefined
> foo
Foo
在最后一行中,Chrome清楚地知道该对象属于Foo
类型。然而,这可能只是Chrome的一部分,而不是标准的JavaScript,甚至是语言本身无法访问的。
答案 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
> ""
答案 1 :(得分:2)
如果不修改模块代码,就无法实现您的目标。
定义类似
的功能时var Foo = function() {...}
函数 - 以及使用它作为构造函数创建的任何对象 - 不知道名称Foo
。您也可以执行var x = 0
,然后尝试获取值0
,告诉您名称x
。
答案 2 :(得分:0)
您可以从Foo
获取foo.constructor
功能
但是,您无法将该函数实例与您为其分配的变量的名称相关联。
答案 3 :(得分:0)
var getName = function(object) {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(object.constructor.toString());
return (results && results.length > 1) ? results[1] : "";
};
您实际上只是将整个构造函数作为字符串抓取,然后提取其名称。
但有一点需要注意:就像clentfort对SLaks的回答所说的那样,没有人阻止任何人覆盖对象的构造函数属性。
另一个警告:你也必须明确命名你的功能。