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

Ada*_*dam 4 javascript loops object instance 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>';
}
Run Code Online (Sandbox Code Playgroud)

但这version也是输出:

make
model
version
Run Code Online (Sandbox Code Playgroud)

我真的很喜欢这个想法隐藏某些功能/方法,但访问很容易像car_instance.version,而事实上,如果我太CONSOLE.LOG下,它有其他属性的对象未列入在循环.

那我该怎么解决呢?

Sar*_*raz 6

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

function Car(){
  // private var
  var version = '1.0';
  // public var
  this.foo = 'something';
}
Run Code Online (Sandbox Code Playgroud)

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

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

更多信息:

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


pim*_*vdb 6

如果您想从for in循环中“隐藏”实例的直接属性的属性,您可以使用Object.defineProperty

Object.defineProperty(car_instance, "version", {
  value: "1.0",
  writable: true,
  configurable: true,
  enumerable: false  // don't make it appear in a for in loop
});
Run Code Online (Sandbox Code Playgroud)