5

我想确定在JavaScript中生成类名称的规则。我贴这个脚本到Chrome浏览器开发工具控制台:如何在Chrome开发工具中为自定义类计算javascript类名称?

var obj = { 
    Constr : function() { } 
}; 

var obj2 = obj; 
console.log(new obj.Constr()); 
console.log(new obj2.Constr()); 

obj2.Constr2 = function() { }; 
console.log(new obj.Constr2()); 
console.log(new obj2.Constr2()); 

而且这里的结果在控制台:

obj.Constr 
obj.Constr 
obj2.Constr2 
obj2.Constr2 

看来,类的名称是由变量确定的构造函数最初被分配到。我正在寻找CDT用来生成这个名字的准确规则。此外,这与Google Closure Compiler可识别的名称相同吗?

我试图看看我是否可以在Firebug中重现类似的行为,但我似乎无法获得在控制台中打印出来的类名称。作为第二个问题,有没有人知道如何在萤火虫中看到这个?

回答

3

Javascript中没有类,因为它是基于原型的OOP,而不是基于类的。 Chrome显然做了一些演绎,以便在控制台中打印对象的一些描述,但这不是标准的Javascript - 在标准中,对象没有命名类,并且你不能找出对象所属类的名称,因为唯一的继承是通过实际的[[Prototype]]内部伪属性完成的,这个内部伪属性本身也是一个对象,没有名称或“类”。通常,您可以通过查看object.__proto__.constructor.name来推断出类似于类名的东西,该名称将返回该对象实例化的构造函数的名称; 此函数可能是匿名的,您的浏览器可能不支持非标准的__proto__属性,对象的原型可能不包含对其构造函数的正确引用。一般来说,你不能知道JS中对象的“类”;您只能测试下降(object instanceof Constructor),但仍然按照对象原型中的constructor属性执行,其中可能不正确。

+1

所以,正如我担心的那样,CDT打印的名字并不来自ecmascript规范。这对开发人员来说只是一种调试方便。我对JavaScript相当陌生,我一般都喜欢原型风格,但是我发现像dojo和extjs这样的图书馆试图用OO风格的编程来解决问题让人失望。我认为这混淆了Javascript的一个更好的功能。 –

+1

Javascript是一种_very_ OO语言,实际上它非常灵活。有很多库在Javascript的基础上构建了一个典型的基于类的OO,并且通常工作得很好。对于这些库或Javascript本身来说,这不一定是坏事。 – lanzz

相关问题