2009-08-08 27 views
5

nếu tôi có một nhà xây dựng đối tượng như:Looping qua tất cả các trường hợp của một đối tượng javascript

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

và tôi làm cho một số mèo:

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

Có thể lặp qua tất cả những con mèo tôi có khai báo? Một cái gì đó như:

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

Điều đó không hiệu quả. Mọi người thường lưu trữ tất cả các vật thể mèo trong một mảng? Hoặc tạo một đối tượng khác có chứa một mảng của từng con mèo:

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

Cảm ơn bạn đã biết mọi mẹo!

Trả lời

0

Nếu bạn muốn đi qua tất cả trong số họ lưu trữ chúng trong mảng sẽ có ý nghĩa ..

cái gì đó dọc theo dòng của var mèo = [];

cats[0] = new cat(); 

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

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

Xin lỗi vì tất cả chỉnh sửa- nửa đêm nay.

5

Không thể lặp qua tất cả các đối tượng bạn đã tạo trừ khi bạn theo dõi chúng ở đâu đó (như trong hàm dựng). Một cái gì đó như thế này-

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 

Xem ra. Miễn là các đối tượng nằm trong mảng, chúng nằm trong bộ nhớ mà không thu thập rác. Vì vậy, nếu bạn tạo ra rất nhiều đối tượng, bạn có thể muốn loại bỏ chúng khỏi mảng khi bạn đã hoàn thành nó.

Ngoài ra, không sử dụng for..in để lặp qua các vòng lặp. Xem này Javascript Array extension

4

Bạn có thể làm một loại một CatFactory đối tượng, dành riêng để tạo ra và theo dõi các trường hợp đối tượng Cat:

Cách sử dụng:

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

Thực hiện:

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

Hoàn toàn tuyệt vời!Đoạn mã duy nhất tôi có thể tìm thấy rằng các tập hợp tạo ra các thể hiện và kiểm soát/lưu lại để thao tác trong tương lai. Thanh lịch và đáng yêu! –

1

Làm thế nào về điều này:

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 

Với cái này, bạn không có bất kỳ vars toàn cầu khó chịu nào và bạn không phải thay đổi giao diện của mình từ biểu mẫu nguyên mẫu Cat.

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

Bạn có thể làm cho giao diện vòng lặp của bạn bất cứ điều gì bạn muốn (một chức năng getAllCats() mà trả về một mảng, hoặc bất cứ điều gì).

0

kể từ khi tôi chỉ có một vấn đề tương tự, đây là một giải pháp dễ dàng nếu bạn sử dụng 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); 
}); 
Các vấn đề liên quan