代码之家  ›  专栏  ›  技术社区  ›  Keith Bentrup

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

  •  3
  • Keith Bentrup  · 技术社区  · 15 年前

    例如,比较这两个:

    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 回复  |  直到 15 年前
        1
  •  6
  •   Christian C. Salvadó    15 年前

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

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

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

    可以命名匿名函数,但这些名称仅可见 在函数本身中,由于使用了新的运算符,将设置构造函数属性,并且您将能够看到名称。

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

    console.log(john2.constructor === MyJSLib.Person); // true
    
        2
  •  3
  •   BYK    15 年前

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

    var MyJSLib = {
     Person : function Person(name) {
       this.name = name;
     }
    }
    
        3
  •  -1
  •   M. Utku ALTINKAYA    15 年前

    您需要的是名称空间中持有者的名称,所以。

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