每个属性都有四大特征,分别是:value(值),writeable(可写性),enumerable(可枚举性),configurable(可配置性)。
修改属性特性
Object.defineProperty
(对象,属性,{特征名:特征值})
var person = {};
Object.defineProperty(person, 'name', {
writable: false,
value: 'A'
})
alert(person.name) //A
person.name = 'B'
alert(person.name) //B
通过Object.defineProperty()创建的属性,configurable默认值为false。且,configurable为false后,永远是false。
通过对象创建的属性,configurable enumerable writable默认都为true
通过Object.defineProperties修改多个属性特性,语法:
Object.defineProperties(对象,{
属性名: {
特征名: 特征值,
特征名: 特征值
},
属性名: {
特征名: 特征值,
特征名: 特征值
}
})
获取对象属性的特征getOwnPropertyDescriptor:
var info = Object.getOwnPropertyDescriptor(person,"name");
console.log(info);
//{"value":"hester","writable":true,"enumerable":true,"configurable":true}
writable特征
console.log(person.name); // hester
Object.defineProperty(person,"name",{writable:false});
person.name = "jack";
console.log(person.name); // hester
属性设置writable为false后,不可修改该属性的值
enumerable特征
for(var p in person){
console.log(p);
} // name,age
Object.defineProperty(person,"name",{enumerable:false});
for(var p in person){
console.log(p);
} // age
console.log(person.name); // hester
属性设置enumerable为false后,不可被枚举出来,比如for…in循环等。但是可以访问
configurable特征
Object.defineProperty(person,"name",{configurable:false});
属性设置configurable为false后:
1.不可设置configurable为true;
2.不可设置enumerable(true为false 和 false为true均不可以);
3.不可设置writable由false为true,可设置writable由true为false
检查属性的enumerable特征状态
person.propertyIsEnumerable("name"); // false