kay*_*ahr 4 javascript ecmascript-5
我们来看下面的示例代码:
var ns = {}; // Some namespace
ns.Test = function()
{
// Constructor of class Test
};
var inst = new ns.Test();
var className = hereIsTheMagic(inst); // Must return "ns.Test"
Run Code Online (Sandbox Code Playgroud)
所以我在命名空间'ns'中创建了一个名为'Test'的类,并且这个类的实例名为'inst'.现在我想找出班级名称.我怎样才能做到这一点?
到目前为止,我通过为每个类提供一个带有类名的字符串属性来解决这个问题,因此我可以使用它inst.constructor.className来访问类名.但是如果可能的话,我想停止这样做,因为在复制/粘贴类时它很容易出错.
如果没有适用于所有当前浏览器的解决方案,可能在未来的ECMAScript规范中至少有一些新功能可以提供对类名的访问?
JavaScript没有类,它有构造函数和原型链.它们在一起看起来有点像课程,但它们确实不是.:-)
不,没有标准方法hereIsTheMagic可以在您的示例中找到字符串"ns.Test",甚至在ECMAScript 5中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
}
})();
Run Code Online (Sandbox Code Playgroud)
...这是一个好主意,因为它有助于工具帮助您,但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(){...}").这完全是非标准的,但在桌面浏览器上很常见; 它在几个移动浏览器上不起作用,在任何情况下都可能是个坏主意.:-)