我想使一些对象的属性被隐藏,一些属性在迭代时可见。所以我尝试使用原型,但这不起作用:
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循环中。
那我该如何解决呢?
答案 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>';
}
}
更多信息:
答案 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);
}
使用不同的数据模型。优点是你可以在循环中跳过一个属性,因为该属性是一个对象,你可以在其中放入任意数量的键/值。