码迷,mamicode.com
首页 > Web开发 > 详细

《js高级程序设计》6.1.1-6.1.3——数据属性

时间:2015-07-21 14:25:03      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

数据属性:该属性包含了一个数据值的位置,它包含了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( )修改同一属性。
在非严格情况下修改无法配置的属性操作会被忽略,在严格模式下会抛出错误。

《js高级程序设计》6.1.1-6.1.3——数据属性

标签:

原文地址:http://www.cnblogs.com/mmlvj/p/4664071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!