将属性对象的选定对象从原型推送到数组中

时间:2014-07-05 14:45:18

标签: javascript oop

我首先对标题道歉。

我有一个尚未实例化的原型:

noZoomzoom个对象将在实例化时填充对象。

我想从propertiesToIlluminate array构造函数中的所有属性中推送noZoom Persona个对象中的所有对象。

function Persona() {
    this.headArea = {
        noZoom: {},
        zoom: {}
    }
    this.torsoArea = {
        noZoom: {},
        zoom: {}
    }
    this.arm = {
        noZoom: {},
        zoom: {}
    }
    this.leg = {
        noZoom: {},
        zoom: {}
    }
    this.pelvis = {
        noZoom: {},
        zoom: {}
    }
    this.abdomen = {
        noZoom: {},
        zoom: {}
    }

    this.illuminate = function() {
        var propertiesToIlluminate = [],
            prop, illuminateInternal, i = 0,
            delay = 100,
            intervalId;
        for (prop in //what to put here//) {
            propertiesToIlluminate.push(prop);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

试试这个:

for (prop in this) {
    if (this[prop].noZoom) {
        for (key in this[prop].noZoom) {
            if (this[prop].noZoom.hasOwnProperty(key)) {
                propertiesToIlluminate.push(this[prop].noZoom[key]);
            }
        }
    }
}

答案 1 :(得分:1)

保留一个属性列表可能有意义,然后减少它来构建数组。类似的东西:

function Persona() {
  var properties = ["headArea", "torsoArea", "..."];
  // ...

  this.illuminate = function() {
    var self = this;
    var propertiesToIlluminate = properties.reduce(function(arr, propName) {
      var noZoom = self[propName].noZoom;
      for (var prop in noZoom) {
        if (noZoom.hasOwnProperty(prop)) {
          arr.push(noZoom[prop]);
        }
        return arr;
      }
    }, []);
  }
}

同样的列表也可以用来实例化开始的对象,迭代它以构建初始状态。

for (var i=0; i<properties.list; i++) {
  this[properties[i]] = {noZoom: {}, zoom: {}};
}

如果需要,它也可以在原型上公开,因此其他代码可以轻松获得所有属性的列表。