6

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

​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 in 循环中。

那么我应该如何解决这个问题呢?

4

4 回答 4

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

于 2012-06-10T17:45:58.427 回答
5

如果要从作为实例的直接属性的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
});
于 2012-06-10T17:51:19.133 回答
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>';
}
于 2012-06-10T17:48:25.923 回答
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);
}

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

于 2012-06-10T18:00:53.930 回答