2009-08-08 18 views
5

jeśli mam konstruktora obiektu takich jak:Przelotowe wszystkich instancji JavaScript Object

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

i robię jakieś koty:

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

jest to możliwe do pętli wszystkich kotów mam zdeklarowany? Coś jak:

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

To jednak nie działa. Czy ludzie zwykle przechowują wszystkie obiekty kotów w tablicy? Lub utwórz inny obiekt zawierający tablicę poszczególnych kotów:

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

Dzięki za porady!

Odpowiedz

0

Jeśli chcesz przejść przez wszystkie z nich przechowując je w tablicy ma sensu ..

Coś wzdłuż linii var kotów = [];

cats[0] = new cat(); 

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

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

Przepraszam za wszystkie edycje - na wpół śpiący dziś wieczorem.

5

Nie można przechodzić przez wszystkie utworzone obiekty, chyba że gdzieś ich zapisałeś (jak w konstruktorze). Coś podobnego -

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 

Uważaj jednak. Dopóki obiekty znajdują się w tablicy, pozostają w pamięci bez zbierania śmieci. Jeśli więc tworzysz wiele obiektów, możesz chcieć usunąć je z tablicy, gdy już to zrobisz.

Ponadto nie należy używać for..in do iterowania za pomocą pętli. Zobacz ten Javascript Array extension

4

Można zrobić coś w rodzaju CatFactory obiektu, dedykowane do tworzenia i śledzenia instancji obiektów cat:

Zastosowanie:

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

Realizacja:

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

Absolutnie cudowny!Jedyny fragment kodu, który mogłem znaleźć, który aglomeruje tworzenie instancji I kontroluje/zapisuje dla przyszłej manipulacji. Elegancki i genialny! –

1

Co powiecie na to:

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 

W tym przypadku nie masz żadnych nieprzyjemnych globalnych zmiennych i nie musisz zmieniać interfejsu z prototypowego formularza Cat.

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

można dokonać interfejsu pętli cokolwiek chcesz (a getAllCats() funkcję, która zwraca tablicę, lub cokolwiek).

0

ponieważ ja właśnie miałem podobny problem, oto jedno proste rozwiązanie, jeśli używasz 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); 
});