【问题标题】:How to find the function name of namespaced constructors in javascript?如何在javascript中找到命名空间构造函数的函数名?
【发布时间】:2009-08-23 19:49:37
【问题描述】:

例如,比较这两个:

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 方法来获取更多信息,但我想要最简单的方法。

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

【问题讨论】:

    标签: javascript constructor namespaces


    【解决方案1】:

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

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

    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,谢谢!我没有尝试过,我会(错误地)假设该表单会将 Person 构造函数引入全局命名空间。很高兴知道。
    • 匿名函数是匿名的是有原因的 :) 你在这个属性赋值右边的只是一个函数表达式(根据定义它可以有可选的标识符)
    【解决方案2】:

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

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

    【讨论】:

    • john2 instanceof MyJSLib.Person 返回真。但我猜 OP 不想针对特定名称进行测试
    • 嗯,我给出了第二个答案,这与 CMS 的答案相同,后者在我之后发送。谢谢兄弟...
    • 我没有对你投反对票,我试图为你的回答提供更多细节
    • 所以,无论是谁,都要感谢他 =) 并且非常感谢您尝试解释;)
    【解决方案3】:

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

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

    【讨论】:

    • 这绝对不适用于 Keith Bentrup 给出的代码。为了让它工作,你应该递归查找。那会非常慢。
    • 将窗口更改为命名空间变量。这里没有递归。
    • 这不是一个好方法。请阅读我所说的:“它应该是递归的”,尽管它不是。
    • 请定义好方法,它是分配给变量的实际名称,没有其他方法。因为他说他不希望像 stingTo 这样的方法返回类名。他在哪里提到递归的东西,我没有在其他人中看到命名空间。即使这是一个要求,也只能将这些命名空间添加为预定义的持有者等。我只是想表明名称仅在命名空间中有意义,它不是真正的标识符。
    • 请查看我的答案和接受的答案。如果您可以在一个步骤中针对所有条件做某事,并且如果有另一种需要递归来处理所有条件的方式,那么递归方式当然是“坏的”。
    猜你喜欢
    • 2015-07-28
    • 2012-06-13
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2013-10-25
    • 2019-07-16
    相关资源
    最近更新 更多