Javascript:如何干净地遍历对象?

时间:2012-06-10 17:42:42

标签: javascript object instance loops for-in-loop

我想使一些对象的属性被隐藏,一些属性在迭代时可见。所以我尝试使用原型,但这不起作用:

​function Car(){}

Car.prototype.version = '1.0';

var car_instance = new Car();
car_instance.make = 'BMW';
car_instance.model = 'x5';

for(property in car_instance){
    document.body.innerHTML += property + '<br>';
}

但这也会输出version

make
model
version

我真的很喜欢隐藏一些函数/方法,但很容易像car_instance.version一样访问它,事实上如果我在console.log中对象,它在 proto 下也有其他属性不在for循环中。

那我该如何解决呢?

4 个答案:

答案 0 :(得分:6)

要创建私有变量,您必须在函数内部声明它,因为JS具有功能范围:

function Car(){
  // private var
  var version = '1.0';
  // public var
  this.foo = 'something';
}

在迭代对象时,使用hasOwnProperty仅获取实际的对象属性:

for(property in car_instance){
   if (car_instance.hasOwnProperty(property)) {
     document.body.innerHTML += property + '<br>';
   }
}

更多信息:

http://javascript.crockford.com/private.html

答案 1 :(得分:2)

如果您想要隐藏<{1}}循环中的某个属性 该实例的直接属性,您可以使用for in

Object.defineProperty

答案 2 :(得分:1)

for(property in car_instance){
    if (car_instance.hasOwnProperty(property)) {
        document.body.innerHTML += property + '<br>';
    }​
}

输出:

 make
 model


或者:

var car = Object.create(null);
​car.make = 'BMW';
car.model = 'x5';

for(property in car) {
    document.body.innerHTML += property + '<br>';
}

答案 3 :(得分:1)

跳过命名属性:

function Car(){
   this.private = {};
}

var inst = new Car();
inst.private.version = '1.0';
inst.make  = 'BMW';
inst.model = 'x5';

for(prop in inst){
    if (prop==='private') continue;        // skip named property
    console.log(prop);
}

使用不同的数据模型。优点是你可以在循环中跳过一个属性,因为该属性是一个对象,你可以在其中放入任意数量的键/值。