2009-08-08 7 views
5

のすべてのインスタンスをループはjavascriptオブジェクト

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

ありがとう:または個々の猫の配列を含む別のオブジェクトを作ります!

答えて

0

あなたが理にかなって配列に格納それらのすべてを通過したい場合は...

のvar猫の線に沿って

何か= [];

今日は半分眠っています。

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を使用しないでください。猫のオブジェクトのインスタンスを作成し、追跡する専用の、あなたがCatFactoryオブジェクトの並べ替えを行うことができ、このJavascript Array extension

4

を参照してください:

使用法:

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]); 
    } 
    } 
}; 
+0

絶対に素晴らしいです!唯一のコードでは、インスタンスを作成し、将来の操作のために制御/保存することができます。エレガントで元気! –

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()機能)を行うことができます。

0

私はちょうど同じような問題があったので、あなたはjqueryを使用する場合は、ここでは1つの簡単な解決策があります:

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); 
}); 
関連する問題