如何在javascript中找到命名空间构造函数的函数名?

时间:2009-08-23 19:49:38

标签: javascript constructor namespaces

例如,比较这两个:

function Person(name) {
 this.name = name;
}
var john = new Person('John');
console.log(john.constructor);
// outputs: Person(name)

var MyJSLib = {
 Person : function (name) {
   this.name = name;
 }
}
var john2 = new MyJSLib.Person('John');
console.log(john2.constructor);
// outputs: function()

第一种形式对于在运行时调试很有用。第二种形式需要一些额外的步骤来确定你拥有什么样的物体。

我知道我可以编写一个描述性的toString函数或者在构造函数上调用toSource方法来获取更多信息,但我想要最简单的方法。

有办法做到这一点吗?建议?

3 个答案:

答案 0 :(得分:6)

这是因为您使用的是匿名函数。

您可以指定匿名函数的名称(是的,听起来很奇怪),您可以:

var MyJSLib = {
 Person : function Person (name) {
   this.name = name;
 }
}
var john2 = new MyJSLib.Person('John');
console.log(john2.constructor);

可以命名匿名函数,但这些名称只能显示 在函数本身内,并且由于您使用new运算符,因此将设置构造函数属性,并且您将能够看到名称。

您还可以使用或不使用函数名称来比较构造函数引用:

console.log(john2.constructor === MyJSLib.Person); // true

答案 1 :(得分:3)

如果要检查对象是否是特定类的实例,则只需使用“instanceof”关键字进行检查。如果你明确想要一个构造函数的名称(我真的看不到一点)你可以尝试下面的代码

var MyJSLib = {
 Person : function Person(name) {
   this.name = name;
 }
}

答案 2 :(得分:-1)

你想要的是命名空间中持有者的名字。

function getName(namespace, obj) {
  for name in namespace:
    if (namespace[name] == obj) return name;
}
console.log(getNameOf(MyJSLib, john2.constructor));