如果我在HTML页面中定义了一些javascript类和实例。 我怎样才能获得这些实例的名称?
<html>
<head></head>
<body>
<script type="text/javascript">
function Vehicle(hasEngine, hasWheels) {
this.hasEngine = hasEngine || false;
this.hasWheels = hasWheels || false;
}
function Car (make, model, hp) {
this.hp = hp;
this.make = make;
this.model = model;
}
var car1 = new Car();
var v1 = new Vehicle();
</script>
</body></html>
是否有一个javascript库来执行此操作?
我想获取类的所有实例和名称,以从页面中定义的静态对象生成UML类图。
实际上,当您编写实例名称时,Firebug控制台会执行相同的操作。他自动知道页面中的所有实例及其所有方法。 不是在运行时在控制台中定义的对象。
答案 0 :(得分:0)
这样做会不会好得多?
function Car (name /*, other variables */) {
this.Name = name;
// other properties
}
var car1 = new Car("car1");
console.log(car1.Name);
您应该在代码中知道变量名称。如果你不这样做,你显然做错了。
据我所知,您只能获得Car
,Vehicle
及其属性名称(hp
,make
,model
)。
for (var i in car1) {
if (car1.hasOwnProperty(i))
console.log(car1[i]);
}
会给你
hp
make
model
和
car1.constructor.name
会给你
Car
知道页面中的所有实例
如果你想获得Car
的所有实例,你必须将它们存储在一个数组中(这是最好的方法),或者,你可以得到它们自己迭代遍历页面中的所有变量(这很可怕)。
for (var i in window) {
if (window[i].constructor.name == "Car") {
console.log(window[i]) // -> here you'll have the object
console.log(i) // -> here you'll have the variable name
}
及其所有方法
对象的方法应存储在其原型中,具体取决于您构建类的方式。
car1.prototype
包含Car
原型中声明的方法。
另一种方法,对于不在原型中的方法,就是这个(这又是可怕的):
for (var i in car1) {
if (car1.hasOwnProperty(i) && typeof(car1[i]) == 'function')
console.log(car1[i]);
}
答案 1 :(得分:0)
这需要更改您的类定义,但您可以让每个类自行注册:
function Vehicle(...) {
...
this.constructor.instances.push(this);
}
Vehicle.instances = [];
function Car(...) {
...
this.constructor.instances.push(this);
}
Car.instances = [];
然后至少你可以遍历Vehicle.instances和Car.instances。正如@Saturnix所提到的,每个实例的constructor.name
属性将为您提供构造函数的名称:
var i = 0, length = Car.instances.length, instance
for (i; i < length; i++) {
instance = Car.instances[i];
console.log(instance.constructor.name + " [" + i + "]", instance);
}