假设以下程序:
var C = function() { };
x = new C();
表达式x instanceof C
产生True,因此x
必须知道它是由函数C
构造的。有没有办法直接从C
检索名称x
?
(在我手头的问题中,我有一个原型层次结构在我的应用程序中实现可能的信号。我必须访问一个信号的类型,它应该等同于用于创建该信号的构造函数。)
答案 0 :(得分:31)
在Chrome(7.0.544.0 dev)上,如果我这样做:
function C() { }
var x = new C();
console.log(x.constructor.name);
它打印'C'...但是如果C被定义为一个未命名的函数,它会打印一个空字符串。
如果我打印x.constructor
,它打印的内容与我在您的代码中打印C
时的打印方式相同。 instanceof运算符只需要比较这两个值,看它们是否等于能够返回true
。
答案 1 :(得分:9)
此代码将获取构造函数的名称,只要它不是匿名函数:
obj.constructor.toString().match(/function (\w*)/)[1];
为什么需要课程名称?假设您想通过JSON保存和恢复类实例。您可以将类名存储在“type”属性中,然后使用JSON.parse中的解析程序函数来还原对象。 (参见示例代码on this page)。
因此,理论上你可以使用上面的代码来创建一个可以处理任何类实例的通用序列化器,但是解析函数字符串效率非常低。通过要求您要存储的所有类明确提供类型,可以避免这种开销:
function Foo() {}
Foo.prototype.type = 'Foo';
这看起来很愚蠢和冗余,这就是我开始寻求隐式获取类名的原因。但最后我必须放弃:JS中没有可接受的解决方案: - (
答案 2 :(得分: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
答案 3 :(得分:2)
您也可以声明您的课程:
var C = function C() { };
现在你的C
类构造函数是一个命名函数(不再是匿名函数),这意味着你可以这样做:
x = new C();
console.log(x.constructor.name); // output: C
答案 4 :(得分:0)
你的代码需要知道构造函数,它可以访问构造函数本身吗?如果是这样,你可以做那个实例。
似乎你需要通过名字来了解它。这听起来很危险。有人可以创建一个恰好具有相同名称的另一个构造函数,它将通过(当然,除非那是你想要的)。
答案 5 :(得分:-1)
至少在React中它可能是
this.default.name