Перебирая все экземпляры объекта javascript - PullRequest
5 голосов
/ 08 августа 2009

если у меня есть конструктор объекта, например:

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 08 августа 2009

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

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

4 голосов
/ 08 августа 2009

Вы можете создать своего рода объект 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]);
    }
  } 
};
1 голос
/ 15 ноября 2011

Как насчет этого:

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 голосов
/ 06 сентября 2014

, поскольку у меня только что была похожая проблема, вот одно простое решение, если вы используете 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);
});
0 голосов
/ 08 августа 2009

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

Что-то вроде var cats = [];

cats[0] = new cat();

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...