如何计算Chrome开发工具中自定义类的javascript类名?
我试图确定在javascript中生成类名的规则。我将此脚本粘贴到Chrome开发工具控制台:如何计算Chrome开发工具中自定义类的javascript类名?,javascript,google-chrome-devtools,google-closure-compiler,Javascript,Google Chrome Devtools,Google Closure Compiler,我试图确定在javascript中生成类名的规则。我将此脚本粘贴到Chrome开发工具控制台: 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(
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用于生成此名称的精确规则。另外,这是谷歌闭包编译器识别的同一个名称吗
我试图看看是否可以在Firebug中重现类似的行为,但似乎无法在控制台中打印类名。作为第二个问题,有人知道如何在firebug中看到这一点吗?Javascript中没有类,因为它是基于原型的OOP,而不是基于类的。Chrome显然会进行一些推断,以便在控制台中打印对象的一些描述,但这不是标准的Javascript-在标准中,对象没有命名类,并且您无法确定对象所属的类的名称,因为唯一的继承是通过实际的
[[Prototype]]完成的
内部伪属性,它本身也是一个对象,没有名称或“类”。通常,您可以通过查看object.\uuuu proto\uuuu.constructor.name
来推断类似于类名的内容,这将返回函数的名称,该函数是实例化对象的构造函数;但是此函数可能是匿名的,或者您的浏览器可能不支持非标准的\uuuuu proto\uuuu
属性,或者对象的原型可能不包含对其构造函数的正确引用。一般来说,你无法知道JS中对象的“类”;您只能测试后代(构造函数的对象实例),但这仍然是根据对象原型中的构造函数
属性实现的,这可能是不正确的。因此,正如我所担心的,CDT打印出来的名称不是来自ecmascript规范。对于开发人员来说,这只是一种调试便利。我对Javascript相当陌生,我通常喜欢原型风格,但dojo和extjs等库试图采用OO风格的编程,这让我感到失望。我认为这混淆了Javascript的一个更好的特性。Javascript是一种非常面向对象的语言,实际上非常灵活。有很多库在Javascript之上构建了一个典型的基于类的OO,这通常非常有效。这对这些库或Javascript本身来说都不一定是坏事。