2009-08-08 3 views
5

, если у меня есть конструктор объекта типа:Перебор всех экземпляров объектов JavaScript

function cat(color, sex){ 
    this.color = color; 
    this.sex = sex; 
} 

и я сделать некоторые кошка:

var fluffball = new cat("blue","male"); 
var shiznitz = new cat("red","male"); 
var slothersburger = new cat("green","female"); 

Можно ли перебрать все кошки у меня есть объявили? Что-то вроде:

var current_cat; 
for(current_cat in document.cat){ 
    alert(current_cat.color); 
} 

Это не работает. Обычно ли люди хранят все объекты кошки в массиве? Или создать другой объект, содержащий массив отдельных кошек:

function all_cats(){ 
    this.the_cats = new Array(); 
} 

Спасибо за любые советы!

ответ

0

Если вы хотите, чтобы пройти через все из них хранить их в массиве будет иметь смысл ..

Что-то вдоль линий вар кошек = [];

cats[0] = new cat(); 

cats[0].color = "red"; 
cats[0].name = "fluffy"; 

for (var cur in cats) 
{ 
    //Do Things 
} 

Извините за все правки - в половине случаев заснуть.

5

Невозможно просмотреть все созданные вами объекты, если вы не отслеживали их где-то (например, в конструкторе). Что-то вроде этого:

var globalCatArray = []; 

function cat(color, sex){ 
    this.color = color; 
    this.sex = sex; 
    globalCatArray.push(this); 
} 

var fluffball = new cat("blue","male"); 
var shiznitz = new cat("red","male"); 
var slothersburger = new cat("green","female"); 

//use globalCatArray to get all instances 

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

Кроме того, не используйте for..in для повторения петель. Смотрите это Javascript Array extension

4

Вы могли бы сделать своего рода в CatFactory объект, посвященный создания и отслеживания экземпляров объектов Cat:

Использование:

CatFactory.createCat('fluffball', 'blue','male'); 
CatFactory.createCat('shiznitz', 'red','male'); 
CatFactory.createCat('slothersburger', 'green','female'); 


CatFactory.forEachCat (function() { // forEach abstraction 
    alert(this.name + ' is ' + this.color); 
}); 

Реализация:

function Cat (name, color, sex){ 
    this.name = name; 
    this.color = color; 
    this.sex = sex; 
} 

CatFactory = { 
    createCat: function() { 
    var newCat = {}; 
    Cat.apply(newCat, arguments); 
    this.allCats.push(newCat); 
    return newCat; 
    }, 

    allCats: [], 

    forEachCat: function (action) { 
    for (var i = 0; i < this.allCats.length; i++){ 
     action.call(this.allCats[i]); 
    } 
    } 
}; 
+0

Абсолютно изумительно!Единственный фрагмент кода, который я смог найти, что агломераты, создающие экземпляры, управляют/сохраняются для будущих манипуляций. Элегантный и гениальный! –

1

Как насчет:

var Cat = (function cat(color, sex) { 
    var allCats = [], 
     catConstructor = function() { 
      allCats.push(this); 
      this.color = color; 
      this.sex = sex; 
     }; 
    catConstructor.each = function (fn) { 
     for (var i = 0; i < allCats.length; i++) { 
      fn.call(allCats[i]); 
     } 
    }; 
    return catConstructor; 
}()); // execute the function immediately 

С этим, у вас нет никаких неприятных глобальных варов, и вам не нужно изменять свой интерфейс из формы прототипа Cat.

var fluffy = new Cat('brown', 'male'), 
    kitty = new Cat('black', 'female'); 
Cat.each(function() { 
    alert(this.color); 
}); 

Вы можете сделать свой интерфейс петли, что вы хотите (в getAllCats() функцию, которая возвращает массив, или любой другой).

0

, так как я просто была аналогичная проблема, вот один простое решение, если вы используете jquery:

function Cat(color, sex){ 
    this.color = color; 
    this.sex = sex; 
} 

var cats = []; 
function createCat(color, sex) 
{ 
    cats.push(new Cat(color, sex))); 
} 

createCat("white", "male"); 
createCat("black", "female"); 

//iterating cats by using jQuery's $.each 
$.each(cats, function(index, object){ 
     alert(object.color); 
}); 
Смежные вопросы