数据属性:该属性包含了一个数据值的位置,它包含了4个描述行为的特性:
1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
2. [[Enumerable]]:表示能否用for-in循环返回。
3. [[writable]]:表示能否修改属性的值。
4. [[Value]]:包含这个属性的数据值。读取属性值的时候从这个位置读,写入属性值的时候更新到这个位置,默认值为undefined。
直接在对象上定义的属性的数据特性默认如下:
1. [[Configurable]]:true
2. [[Enumerable]]:true
3. [[writable]]:true
4. [[Value]]:”xiaochang” (初始时的赋值)
这些特性不能直接被访问,要修改属性的特性只能通过Object.defineProperty( )方法,该方法包含三个参数:属性所在的对象,属性的名字,描述符对象[configurable|enumerable|writable|value]。例如:
var person = {
age:100
};
Object.defineProperty(person,"name",{
configurable:false,
writable:false,
value:"xiaochang"
});
Object.defineProperty(person,"tall",{
value:160
});
for(attr in person){
console.log(attr); //name,age
}
console.log(person.name); //xiaochang
person.name="CC"; //为name属性指定新值
console.log(person.name); //xiaochang
delete person.name; //删除name属性
console.log(person.name); //xiaochang
console.log(person.age); //100
person.age=200; //为age属性指定新值
console.log(person.age); //200
delete person.age; //删除age属性
console.log(person.age); //undefined
console.log(person.tall); //160
person.tall = 160; //修改tall属性的值
console.log(person.tall); //160
delete person.tall; //删除name属性
console.log(person.tall); //160
分析例子可知直接在对象上定义的属性,如age,[[Configurable]],[[Enumerable]],[[writable]]都被设置为true。
属性name的[[Configurable]],[[writable]]被设置为false,所以无法修改和删除。
调用Object.defineProperty( )方法时,如果不显示指定configurable,enumerable,writable的值,就默认为false,如属性tall。
另外需要注意的是当configurable设置为false后无法再将其改为true,且除了writable之外,无法修改其它特性。在configurable为true的情况下可多次调用Object.defineProperty( )修改同一属性。
在非严格情况下修改无法配置的属性操作会被忽略,在严格模式下会抛出错误。
原文:http://www.cnblogs.com/mmlvj/p/4664071.html