从页面中查找所有Javascript实例

时间:2014-01-30 15:55:52

标签: jquery dom javascript

如果我在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控制台会执行相同的操作。他自动知道页面中的所有实例及其所有方法。 不是在运行时在控制台中定义的对象。

2 个答案:

答案 0 :(得分:0)

这样做会不会好得多?

function Car (name /*, other variables */) {

   this.Name = name;
   // other properties

}

var car1 = new Car("car1");
console.log(car1.Name);

您应该在代码中知道变量名称。如果你不这样做,你显然做错了。

据我所知,您只能获得CarVehicle及其属性名称(hpmakemodel)。

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);
}