确定JavaScript对象实例的类的名称

时间:2012-10-21 01:47:07

标签: javascript reflection prototype-programming

想象一下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,甚至是语言本身无法访问的。

4 个答案:

答案 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)

来自another thread

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

您实际上只是将整个构造函数作为字符串抓取,然后提取其名称。

但有一点需要注意:就像clentfort对SLaks的回答所说的那样,没有人阻止任何人覆盖对象的构造函数属性。

另一个警告:你也必须明确命名你的功能。