繁体   English   中英

如何获取JavaScript类的名称

[英]How to get name of JavaScript Class

我们来看下面的示例代码:

var ns = {}; // Some namespace

ns.Test = function()
{
    // Constructor of class Test
};

var inst = new ns.Test();
var className = hereIsTheMagic(inst); // Must return "ns.Test"

所以我在命名空间'ns'中创建了一个名为'Test'的类,并且这个类的实例名为'inst'。 现在我想找出班级名称。 我怎样才能做到这一点?

到目前为止,我通过给每个类一个带有类名的字符串属性来解决这个问题,所以我可以使用inst.constructor.className来访问类名。 但是如果可能的话,我想停止这样做,因为在复制/粘贴类时它很容易出错。

如果没有适用于所有当前浏览器的解决方案,可能在将来的ECMAScript规范中至少有一些新功能可以提供对类名的访问?

JavaScript没有类,它有构造函数和原型链。 它们在一起看起来有点像课程,但它们确实不是。 :-)

不,没有标准的方法, hereIsTheMagic可以在你的例子中找到字符串“ns.Test”,甚至在ECMAScript 5中也没有。首先, ns.Test可能不是唯一引用该函数的属性(如果你添加了ns.OtherTest = ns.Test; ,那该怎么办? ns.OtherTest = ns.Test; ,例如)。

JavaScript确实具有具有正确名称的函数的概念,但是没有标准方法来访问函数的正确名称,即使可以,您调用ns.Test的函数也是匿名的 您在ns上分配给它的属性有一个名称( Test ),但该函数没有。

你可以给这个函数命名:

var ns = {}; // Some namespace
(function() {
    ns.Test = ns_Test;

    function ns_Test() {
    // Constructor of class Test
    }
})();

...这是一个好主意,因为它有助于工具帮助您 ,但JavaScript代码本身没有标准的方法来获取该名称。 (不要做ns.Test = function ns_Test() { ... };但是。它应该可以工作,但ECMAScript的各种实现都有各种与之相关的错误。在上面链接的文章中有更多关于它的内容 。 )


更新 :我可能应该说:有一些非标准的方法来获取函数的正确名称(在上面的例子中为ns_Test )。

其中最简单的是函数实例上的name属性, 许多实现都支持这些属性,包括:

  • Firefox的SpiderMonkey
  • Chrome的V8
  • Opera的引擎(我不知道它的名字)
  • Safari的引擎(包括Safari移动)

...所以alert(ns_Test.name); 会提醒“ns_Test”。 但它是非标准的 ,不受任何版本的JScript(微软引擎)的支持,甚至不是IE9使用的版本(现在终于发布了!)。 这是一个快速的测试页面: http//jsbin.com/oxuva3

请注意,这也是函数的正确名称(请参阅上面的示例),而不是您为其指定的属性的名称。

如果name不存在,则可以在函数对象上使用toString() ,该函数对象可能 (或可能不)返回函数的字符串表示形式(例如,“function ns_Test(){...}”)。 这完全是非标准的,但在桌面浏览器上很常见; 它在几个移动浏览器上不起作用,在任何情况下都可能是个坏主意。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM