数据属性
- [[Enumerable]]:是否可遍历,也就是是否可以通过for-in找到该属性,默认为true
- [[Writable]]:是否可修改,默认为true
- [[Value]]:属性值,默认undefined
[[Configuarble]]:表示能否通过delete属性从而重新定义属性,能否修改属性的特征,总的来说就是是否允许修改属性,默认值为true
var obj = {
age:20,
name:'ming'
}
// 对于直接在字面量中定义的属性,configurable,writable,enumerable属性都是true
// 对于在defineProperty中定义的属性,configurable,writable,enumerable属性都是false
Object.defineProperty(obj,'name',{
writable:false, // 不写也没关系,反正都是false
configurable:true,
value:'dong'
})
console.log(obj.name) // dong
obj.name="wei";
console.log(obj.name) //dong,因为不能修改
console.log(Object.getOwnPropertyDescriptor(obj,'name')) // 查看属性
delete obj.name;
console.log(obj) //{name:20} name属性被删除了
console.log(Object.getOwnPropertyDescriptor(obj,'name')) // undefined,没有name属性了
访问器属性
var person = {
_year:2010,
age:0,
}
// 这里year必须要用_year来保存自己的值,否则在get中获取自身的值,会一直循环
Object.defineProperty(person,'year',{
get:function(){
console.log('get')
return this._year;
},
set:function(newYear){
if(newYear>this._year){
console.log('set')
this.age=newYear-this._year;
this._year = newYear;
return this.age;
}
},
configurable:false
})
person.year = 2019;
console.log(person.age); // set 9
console.log(person.year); // get 2019
网友评论