最近在看书js高级程序设计时,看到了对象的属性类型,下面的代码还是可以看懂的:
<script type="text/javascript">
//用面向字面量的方式创建一个book对象
var book={_year:2000,edition:0};
//调用Object.defineProperties(对象名,要添加的属性)方法,为对象一次定义多个属性(1.数据属性)(2.访问器属性)
Object.defineProperties(book,{
//添加的两个数据属性(_year,edition)
_year:{//(_year)前面的下划线表示只能通过对象方法访问的属性
value:2004,
},
edition:{
value:1,
},
//添加了访问器属性(year)
year:{
//调用get方法读取属性
get:function(){
return this._year;
},
//调用set方法写入属性
set:function(newValue){
if (newValue>2004) {
this._year=newValue;
this.edition+=(newValue-2004);
}
}
}
});
console.log(book.year); //2004
console.log(book._year); //2004
//测试
book.year=2008;//访问器属性常见方式,设置一个属性的值会导致其他属性发生变化
console.log(book.year); //2008
console.log(book.edition); //5
</script>
但是 如果一开始声明 空对象 var book={}; 然后通过Object.defineProperties()的方法设置属性
var book={}; //空对象
Object.defineProperties(book,{
year: {
value:2004,
},
edition: {
value: 1
},
year:{
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue-2004;
}
}
}
});
console.log(book.year); //undefined
console.log(book._year); //undefined
console.log(book.edition); //
for(var k in book){
console.log(k); //什么也没有
}
book.year = 2008;
console.log(book.year); //2008
for(var k in book){
console.log(k); //_year
}
console.log(book.edition); //1
如果把year: {
value:2004,
},
改为 _year: {
value:2004,
},
那么输出一下:
console.log(book.year); //2004
console.log(book._year); //2004
console.log(book.edition); // 1
for(var k in book){
console.log(k); //什么也没有
}
book.year = 2008;
console.log(book.year); //2008
for(var k in book){
console.log(k); //什么也没有
}
console.log(book.edition); //1
找了很多资料都没搞明白为什么,求大神帮忙解答一下
book是个对象,能这样循环?