【问题标题】:Looping through all instances of a javascript object循环遍历 javascript 对象的所有实例
【发布时间】:2010-11-17 21:23:03
【问题描述】:

如果我有一个像这样的对象构造函数:

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

感谢您的任何提示!

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    除非您在某个地方(例如在构造函数中)跟踪它们,否则不可能循环遍历您创建的所有对象。像这样-

    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

    【讨论】:

      【解决方案2】:

      您可以制作一种 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]);
          }
        } 
      };
      

      【讨论】:

      • 太棒了!我能找到的唯一一段代码可以聚合创建实例并控制/保存以供将来操作。优雅而灵动!
      【解决方案3】:

      这个怎么样:

      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() 函数,或其他)。

      【讨论】:

        【解决方案4】:

        如果你想遍历所有这些,将它们存储在数组中是有意义的..

        类似的东西 变种猫 = [];

        cats[0] = new cat();
        
        cats[0].color = "red";
        cats[0].name = "fluffy";
        
        for ( var cur in cats )
        {
            //Do Things
        } 
        

        抱歉所有的编辑 - 今晚睡着了。

        【讨论】:

          【解决方案5】:

          因为我刚遇到类似的问题,如果你使用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);
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-14
            • 2013-03-09
            • 2015-09-16
            • 1970-01-01
            • 2013-10-11
            • 2016-07-08
            • 2015-10-15
            相关资源
            最近更新 更多