2010-10-11 35 views
24

假定以下程序:如何在JavaScript中检索构造函数的名称?

var C = function() { }; 
x = new C(); 

表达x instanceof C产生true,所以x具有以某种方式知道它是由功能C构成。有没有办法直接从x检索名称C

(在我的手边的问题,我有实现在我的应用成为可能信号原型的层次结构。我必须访问哪些应当相当于用于创建信号的构造的信号的类型。)

回答

24

在Chrome(7.0.544.0 DEV),如果我做的:

function C() { } 

var x = new C(); 

console.log(x.constructor.name); 

它打印 'C' ...但是,如果C被定义为一个无名函数就像你拥有它,它将会打印一个空字符串。

如果我打印x.constructor它会打印与我在您的代码中打印C相同的东西。 instanceof运算符只需比较这两个值即可看出它们相当于能够返回true

+0

我想我需要构造函数的名称字符串才能使用构造函数作为数组的索引。但是,如果可以直接使用'x.constructor'作为数组索引,那我就没问题。 – Marc 2010-10-11 11:07:25

+1

@Marc - 在JavaScript中最接近'关联数组'的是一个对象。 JavaScript数组使用整数进行索引。如果使用'x.constructor'作为对象的属性名称(例如'map [x.constructor]'),则隐式调用构造函数属性的'toString'方法。 – sje397 2010-10-11 11:41:56

+0

谢谢!我主要使用Python进行编程,所以你对JavaScript的解释是很有帮助的。我检查了独立Rhino解释器中的x.constructor.toString()方法,它将匿名构造函数的源代码返回给我。 – Marc 2010-10-11 13:26:15

3

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

如果它被定义,像这样:

function C() { }; 
x = new C(); 

那么将有可能使用x.constructor.toString()并解析出函数的名称从返回的字符串。有些浏览器也支持x.constructor.name[1]

[1] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/name

0

你需要知道构造函数的代码,它可以访问构造函数本身吗?如果是这样,你可以做那件事情。

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

7

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

obj.constructor.toString().match(/function (\w*)/)[1]; 

为什么你需要的类名?假设您想通过JSON保存和恢复类实例。您可以将类名称存储在“类型”属性中,然后使用JSON.parse中的解析器函数来恢复对象。 (请参阅示例代码on this page)。

因此,理论上你可以使用上面的代码来生成一个可以处理任何类实例的泛化序列化器,但是解析函数字符串效率很低。这方面的负担会要求所有你要储存,明确规定类型的类来避免:

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

这似乎是愚蠢的,多余的,这就是为什么我一开始就追求含蓄获得的类名。但最终我不得不放弃在:存在JS没有可接受的解决方案:-(

1

您也可以声明你的类此:

var C = function C() { }; 

现在你C类的构造函数不再是一个匿名函数这意味着你可以这样做:

x = new C();  

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

至少在阵营可能是

相关问题