〇、属性类型:ES定义只有内部才能用的特性中使用了对象中属性(property)的一些特征,把这些特性表示在两个中括号中如“[[Configurable]]”,共有两种属性——数据属性和访问器属性,通过这些属性的设置,可以更改属性的特征。
0.数据属性:
[[Configurable]]:表示能否删除属性、重新定义属性、修改属性的特性或把属性修改为访问器属性。不设置时默认为true。
[[Enumerable]]:表示是否可以用for-in循环遍历到该属性。
[[Writable]]:表示该属性是否可修改,即是只读还是可读可写。
[[Value]]:可以通过此属性写入属性值。
如果想修改属性的特性,可以通过Object.defineProperty()方法,该方法接收三个参数:属性所在的对象、属性名和一个特性名和值构成的对象。
var student = {};
Object.defineProperty(student,"age",{
writable:true,
value:18
});
console.log(student.age);//18
student.age = 20;
console.log(student.age);//20
需要注意的是,configurable特性当设置为false时,表示不能删除该属性,就不能再更改为true了,普通模式下没有报错,但严格模式下会导致错误,也就是说,可以用Object.defineProperty()多次修改属性特性,但一旦设置configurable为false,就不能再挽回了。
想一次修改多个属性的特性,使用Object.defineProperties()方法,接收两个参数,第一个参数是对象名,第二个参数是修改的属性和修改的特性构成的对象。
var student = {};
Object.defineProperties(student,{
"age":{
writable:true,
value:18
},
"name":{
writable:true,
value:"Lura"
}
});
1.访问器属性:
[[Configurable]]:表能否删除属性、重新定义、修改属性特性或者能否把属性改为数据属性。
[[Enumerable]]:表能否通过for-in循环遍历到该属性。
[[Get]]:获得属性。默认为undefined。
[[Set]]:写入属性。默认为undefined。
同样,访问器属性必须通过Object.defineProperty()定义。
var student = {
_gender:male
};
Object.defineProperty(student,"gender",{
get:function(){
return this._gender;
},
set:function(newGender){
if(newGender!="male"&&newGender!="female"){
this._gender = "male";
}
}
});
student.gender = "people";
console.log(student.gender);//male
通过get、set特性可以达到筛选合法值的目的。
同样,设置多个属性的方法同样使用Object.defineProperties()方法。