2015-02-25 8 views
0

Не знаю, как фраза на этот вопрос, но в принципе, у меня есть конструктор объекта:Как перечислить все объекты в ООП

function myObject(name, type, size) { 
    this.name = name; 
    this.type = type; 
    this.size = size; 
} 

Затем я создаю все объекты (может быть в сотнях, если я по-прежнему это животное проект)

var newObject1 = new myObject("test name", "test type", "test size"); 
var newObject2 = new myObject("foo name", "foo type", "foo size"); 
var newObject3 = new myObject("bar name", "bar type", "bar size"); 
//etc. 

Теперь, есть цикл, который позволяет мне перебирать каждый объект, который приходит из myObject конструктора? Я попытался использовать это:

console.log(Object.getOwnPropertyNames(myObject)); 

но, конечно, я не знаю, как проходить через каждый объект. Есть ли способ сделать это?

+2

Нет, среда выполнения не предоставляет такой возможности. Чего вы хотите достичь? – Pointy

+1

@pointy, я хотел бы иметь возможность перечислять все объекты в окне выбора или манипулировать ими каким-либо другим способом. Я бы хотел показать их на экране – ntgCleaner

+0

Вы действительно должны просто поместить их в массив. – Bergi

ответ

3

Рабочая среда Javascript не предоставляет никаких возможностей для итерации всех объектов определенного типа. Если вам действительно нужно это сделать, вам придется отслеживать все такие объекты в какой-то структуре данных (возможно, в массиве).

На самом деле, если вы создаете сотни объектов с уникальными именами переменных, тогда это красный флаг, который вы, вероятно, должны писать свой код, чтобы использовать массив этих объектов и обращаться к ним по индексу массива, чем каждый из них с уникальной переменной. Это также сделает ваш код намного более компактным.


Хотя иногда неодобрением в Javascript (потому что он побеждает сбор мусора для отдельных экземпляров, пока они не будут удалены из массива), вы можете также сделать объект просто следить за его собственный список объектов, имеющих конструктор просто добавляет каждый вновь созданный объект в список.

function myObject(name, type, size) { 
    this.name = name; 
    this.type = type; 
    this.size = size; 
    myObject.list.push(this); 
} 

myObject.list = []; 

// to iterate all myObject instances 
for (var i = 0; i < myObject.list.length; i++) { 
    // myObject.list[i] 
} 

Примечание: Вы можете также сохранить возможность создать объект, который не был поставлен в списке, а просто создание функции фабрики, которые создают объект и помещает его в списке:

function myObject(name, type, size) { 
    this.name = name; 
    this.type = type; 
    this.size = size; 
} 

var listOfMyObject = []; 

function makeMyObject(name, type, size) { 
    var o = new myObject(name, type,size); 
    listOfMyObject.push(o); 
    return o; 
} 

// to iterate all myObject instances 
for (var i = 0; i < listOfMyObject.length; i++) { 
    // listOfMyObject[i] 
} 
+0

В случае использования OPs он должен также использовать массив, но заполнять его вручную (не через конструктор) – Bergi

+0

Мой сценарий сложный и, читая ваше утверждение «тогда это красный флаг». Мне интересно, если я делаю это правильный путь. Но я думаю, что это совсем другой вопрос. Спасибо за ответ, я попробую это, и если он станет слишком неряшливым/тяжелым, я сделаю ручной массив, чтобы разместить все, как говорит @Bergi. – ntgCleaner

+1

@ Bergi - Я не думаю, что мы достаточно знаем о том, что фактически делает OP, чтобы знать, следует ли строить массив автоматически или вручную. Если для этого объекта нет другого использования, где объект не должен находиться в массиве, тогда я не вижу проблемы с написанием кода, который автоматически помещает его в массив. Необходимо помнить о влиянии на сбор мусора, если массив не активно поддерживается. Для полноты я добавил еще одну альтернативу с заводской функцией, которая помещает ее в массив, а обычный конструктор - нет. – jfriend00

0

Сохраните ссылку на каждый объект, затем распечатайте эту коллекцию.

var myObjects = []; 
function myObject(name, type, size) { 
    this.name = name; 
    this.type = type; 
    this.size = size; 
    myObjects.push(this); 
} 

// A bunch of new myObject()... 

console.log(myObjects); 
+0

Возможно, дизайн будет более эффективным, если действие 'push' произойдет за пределами конструктора, когда объекты создаются , Либо это, либо сделать массив статическим свойством конструктора 'myObject'. Как и сейчас, расположение списка и ответственность за его сохранение разделяются внутри и снаружи конструктора. – ajp15243

+0

Истинно, но размещение его внутри конструктора гарантирует, что каждая ссылка будет собрана. Речь идет только о том, как вы хотите организовать свой код, и если вы хотите повторно набирать 'myObjects.push'. –

+0

Если вы хотите, чтобы каждый экземпляр был захвачен, почему бы не убедиться, что местоположение этого захвата (массива) связано с конструктором объекта? Это делает его более портативным, если ничего другого. – ajp15243

Смежные вопросы