如何检索构造函数';谁的名字在JavaScript中?

如何检索构造函数';谁的名字在JavaScript中?,javascript,inheritance,Javascript,Inheritance,假设以下程序: var SomeConstructor = function() { }; var instance = = new SomeConstructor (); SomeConstructor的表达式instance instanceof产生True,因此instance必须知道它是由函数SomeConstructor构造的。有没有办法直接从实例检索名称SomeConstructor (在我手头的问题中,我有一个在我的应用程序中实现可能信号的原型层次结构。我必须访问信号的类型,该类

假设以下程序:

var SomeConstructor = function() { };
var instance = = new SomeConstructor ();
SomeConstructor的表达式
instance instanceof
产生True,因此
instance
必须知道它是由函数
SomeConstructor
构造的。有没有办法直接从
实例
检索名称
SomeConstructor


(在我手头的问题中,我有一个在我的应用程序中实现可能信号的原型层次结构。我必须访问信号的类型,该类型应等同于用于创建该信号的构造函数。)

否。您可以使用
x.constructor
直接引用
C
,但它是一个匿名函数,因此无法获取其名称

如果是这样定义的:

function C() { };
x = new C();
然后可以使用
x.constructor.toString()
并从返回的字符串中解析出函数名。一些浏览器还支持
x.constructor.name
[1]

[1]

在Chrome(7.0.544.0开发版)上,如果我这样做:

function SomeConstructor() { }

var instance = new SomeConstructor();

console.log(instance.constructor.name);
它打印“SomeConstructor”…但是如果SomeConstructor被定义为一个未命名的函数,它将打印一个空字符串


如果我打印
instance.constructor
,它打印的内容与在您的代码中打印
SomeConstructor
时相同。instanceof运算符只需比较这两个值,就可以返回
true

您需要知道构造函数的代码,它可以访问构造函数本身吗?如果是这样的话,你可以马上做


看来你需要知道它的名字。这听起来很危险。有人可以创建另一个恰好具有相同名称的构造函数,它将通过(当然,除非这是您想要的)。

此代码将获得构造函数的名称,只要它不是匿名函数:

obj.constructor.toString().match(/function (\w*)/)[1];
为什么需要类名?假设您希望通过JSON保存和恢复类实例。您可以将类名存储在“type”属性中,然后使用JSON.parse中的解析器函数来恢复对象。(参见示例代码)

因此,从理论上讲,您可以使用上面的代码生成一个可以处理任何类实例的通用序列化程序,但是解析函数字符串的效率非常低。通过要求要存储的所有类显式提供类型,可以避免此开销:

function Foo() {}
Foo.prototype.type = 'Foo';

这看起来既愚蠢又多余,这就是为什么我开始寻求隐式获取类名的原因。但最后我不得不让步:JS中没有可接受的解决方案:-(

您也可以声明您的类:

var C = function C() { };
现在,您的
C
类构造函数是一个命名函数(不再是匿名函数),这意味着您可以执行以下操作:

x = new C();    

console.log(x.constructor.name); // output: C

至少在我看来是这样


this.default.name

我想我需要一个构造函数的名称字符串,以便将构造函数用作数组的索引。但是,如果可以将
x.constructor
直接用作数组索引,我就可以了。@Marc-在javascript中最接近“关联数组”的是一个对象。javascript数组是使用整数索引的呃,如果您使用
x.constructor
作为对象的属性名(例如
map[x.constructor]
),那么构造函数属性的
toString
方法将被隐式调用。谢谢!我主要用Python编程,所以您对JavaScript的解释对我帮助很大。我检查了x.constructor.toString()方法,并返回匿名构造函数的源代码。C.name以静态方式返回构造函数的名称