2

想象一个 JavaScript“类” Foo

var Foo = function()
{
};

以及该类的一个实例:

var foo = new Foo();

我可以Foo直接从实例中获取字符串foo,还是Foo只是实例化后无法与实例关联的传递变量foo


编辑 1 SLaks 建议使用foo.constructor. 这给出了:

function ()
{
}

如果函数以以下形式定义,则此方法有效:

function Foo()
{}

...但情况可能并非总是如此。


编辑 2尝试skizeey 的方法也不起作用。作为 Slack 的方法,它本质上是一个更完整的尝试,但会产生一个空字符串:""


编辑 3我想知道这是否真的有可能。请注意来自 Chrome 的 JavaScript 控制台的以下记录:

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

在最后一行,Chrome 清楚地知道该对象的类型是Foo。然而,这可能只是 Chrome 的东西,而不是标准的 JavaScript,甚至无法从语言本身访问。

4

4 回答 4

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
> ""
于 2013-10-14T14:15:28.930 回答
2

如果不修改模块代码,就无法实现您想要的。

当你定义一个函数时

var Foo = function() {...}

该函数 - 以及使用它作为构造函数创建的任何对象 - 不知道名称Foo。您不妨这样做var x = 0,然后尝试获取值0来告诉您有关名称的信息x

于 2012-10-21T02:14:16.680 回答
0

您可以Foo通过 from 获取该功能foo.constructor
但是,您不能将该函数实例与您分配给它的变量的名称相关联。

于 2012-10-21T01:50:17.867 回答
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 的回答时所说的那样,没有人阻止任何人覆盖对象的构造函数属性。

另一个警告:您还必须明确命名您的函数。

于 2012-10-21T02:06:14.320 回答