如果我有一个对象构造函数,如:
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 :(得分: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);
});