标签:
数据属性:该属性包含了一个数据值的位置,它包含了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