- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试确定在 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 中重现类似的行为,但我似乎无法在控制台中打印出类名。作为次要问题,有人知道如何在 Firebug 中看到这个吗?
最佳答案
Javascript 中没有类,因为它是基于原型(prototype)的 OOP,而不是基于类的。 Chrome 显然做了一些推导,以便在控制台中打印对象的一些描述,但这不是标准的 Javascript——在标准中,对象没有命名类,你无法弄清楚对象所属的类的名称,因为唯一的继承是通过实际的 [[Prototype]]
内部伪属性完成的,它本身也是一个对象,没有名称或“类”。通常,您可能会通过查看 object.__proto__.constructor.name
推断出类似于类名的内容,这将返回函数的名称,该函数是从中实例化对象的构造函数; 但是这个函数可能是匿名的,或者您的浏览器可能不支持非标准的__proto__
属性,或者对象的原型(prototype)可能不包含对其构造函数的正确引用。通常,你无法知道 JS 中对象的“类”;您只能测试后代(object instanceof Constructor
),但这仍然是根据对象原型(prototype)中的 constructor
属性实现的,可能不正确。
关于javascript - 如何为 Chrome 开发工具中的自定义类计算 javascript 类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12231139/
我是一名优秀的程序员,十分优秀!