如何在JavaScript中检索构造函数的名称?

Mar*_*arc 28 javascript inheritance

假设以下程序:

var C = function() { };
x = new C();
Run Code Online (Sandbox Code Playgroud)

表达式x instanceof C产生True,因此x必须知道它是由函数构造的C.有没有办法C直接从中检索名称x

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

sje*_*397 31

在Chrome(7.0.544.0 dev)上,如果我这样做:

function C() { }

var x = new C();

console.log(x.constructor.name);
Run Code Online (Sandbox Code Playgroud)

它打印'C'...但如果C被定义为一个未命名的函数,它将打印一个空字符串.

如果我打印x.constructor它打印的相同的东西,如果我打印C你的代码.instanceof运算符只需要比较这两个值,看它们是否等于能够返回true.

  • @Marc - 最接近 JavaScript 中的“关联数组”的是对象。Javascript 数组使用整数进行索引。如果你使用 `x.constructor` 作为对象的属性名称(例如 `map[x.constructor]`),那么构造函数属性的 `toString` 方法将被隐式调用。 (2认同)

pha*_*ann 10

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

obj.constructor.toString().match(/function (\w*)/)[1];
Run Code Online (Sandbox Code Playgroud)

你为什么需要课程名称?假设您想通过JSON保存和恢复类实例.您可以将类名存储在"type"属性中,然后使用JSON.parse中的解析程序函数来还原对象.(参见本页示例代码).

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

function Foo() {}
Foo.prototype.type = 'Foo';
Run Code Online (Sandbox Code Playgroud)

这看起来很愚蠢和多余,这就是为什么我开始隐含地获取类名的原因.但最后我必须放弃:JS中没有可接受的解决方案:-(