循环遍历javascript对象的所有实例

时间:2009-08-08 04:16:21

标签: javascript arrays object

如果我有一个对象构造函数,如:

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

感谢您的任何提示!

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]);
    }
  } 
};

答案 2 :(得分: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()函数,或其他)。

答案 3 :(得分:0)

如果你想通过所有这些将它们存储在数组中会有意义..

有些东西     var cats = [];

cats[0] = new cat();

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

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

抱歉所有的编辑 - 今晚半睡半醒。

答案 4 :(得分: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);
});