请教一个通过访问器属性方式来修改对象属性的问题
javascript吧
全部回复
仅看楼主
level 4
chenqz0826 楼主
今天学到访问器属性这个东东,我写了如下程序:
var book={
_year:2019,
edition:1
};
Object.defineProperty(book,"year",{
get: function(){
return this._year;
},
set: function(newValue){
this._year=newValue;
this.edition+=newValue-2019;
}
});
book.year=2022;
//显示当前各属性值
document.write("_year属性:"+book._year+"<br>");
document.write("属性个数:"+book.year+"<br>");
document.write("edit属性:"+book.edition+"<br>");
//当前book属性个数和属性名称
document.write(Object.getOwnPropertyNames(book).length+"<br>")
document.write(Object.keys(book).)
结果输出:
_year属性:2022
newyear属性:2022
edit属性:4
3
_year,edition
请看一下,book一开始是两个属性,程序中我用defineProperty新定义了一个newyear属生,并列出了运行后的book的属性的值,明明现在是三个属性,且值都正确。但看一下最后两句,我想看看当前的book对象的属性是哪些,一个返回有3个,另一个(keys)只枚举出两个,这是怎么回事?这两个统计函数不一样吗?请大侠指点。。
2022年02月23日 03点02分 1
level 4
chenqz0826 楼主
这个keys()函数在探测别的普通对象时能正确反回结果,却对我上面程序的没有正确反回,难道defineProperty()定义的新属性都是隐含的?
2022年02月23日 03点02分 3
level 2
keys返回的是可枚举属性,而getOwnPropertyNames返回的自身所有的属性包括不可枚举属性,defineProperty设置的默认是不可枚举的,如果要变成可枚举的需要吧enumerable为true
2022年02月23日 05点02分 5
噢!明白了,看来是属性本身的问题,访问器属性默认不可枚举,不像数据属性啊,多谢指点!搞懂了。
2022年02月23日 07点02分
es5阮一峰 属性描述写的很清楚
2022年02月23日 10点02分
level 5
记得是enumerable 还是Symbol.iterator来着
2022年02月24日 06点02分 7
1