2014-01-30 4 views
-2

Если у меня есть некоторые классы и экземпляры 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 Console, когда вы пишете имя экземпляра. Он автоматически знает все экземпляры на странице и все ее методы. Не объекты, определенные в консоли, во время выполнения.

+7

Большую часть времени, когда вам нужно получить программно имя функции/класса, вы делаете что-то неправильно. – adeneo

+0

Потенциально вы имеете в виду это с точки зрения тестирования/документации? qUnit и т. д. сделают это. –

+0

Я хочу получить все экземпляры и имена классов для создания диаграммы классов UML. – GeorgesC

ответ

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

} 
+0

Я хочу получить все экземпляры и имена классов для создания диаграммы классов UML. Практически то же самое, что и консоль от Firebug. – GeorgesC

+0

спасибо @Saturnix. Но как я могу узнать, что объект car1 создан на этой странице? – GeorgesC

+0

см. Обновленный ответ. – Saturnix

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); 
} 
Смежные вопросы