6

我正在尝试确定在 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(new obj2.Constr2());

以下是控制台中的结果:

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

似乎类的名称是由构造函数最初分配给的变量决定的。我正在寻找 CDT 用于生成此名称的精确规则。此外,这与 Google Closure Compiler 识别的名称相同吗?

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

4

1 回答 1

3

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

于 2012-09-01T21:54:42.217 回答