[英]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
属性, 许多实现都支持这些属性,包括:
...所以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.