对象属性

创建对象方式:

1 var person = new Object();
2 person.name = "Nicholas";
3 person.age = 29;
4 person.job = "Software Enginner";
5 
6 person.sayName = function(){
7         alert(this.name);
8 };

或者

1 var person = {
2       name: "Nicholas",
3       age: 29,
4       job: "Software Engineer",
5 
6       sayName: function(){
7             alert(this.name);
8       }
9 };

属性类型:

ECMAScript中有两种属性:数据属性和访问器属性

1、数据属性:(4个)

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。

[[Enumerable]]:表示能否通过for-in循环返回属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。

[[Writable]]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。

[[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入数据值的时候,把新值保存在这个位置。这个特性的默认值为undefined。

 

要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象属性的名字和一个描述符对象。其中,描述符(descriptor)对象的属性必须是:configurable、enumerable、writable和value。设置其中的一或多个值,可以修改对应的特性值。

exp:

1 var person = {};
2 Object.defineProperty(person,"name",{
3         writable:false,
4         value:"Nicholas"
5 })
6 
7 alert(person.name);        //"Nicholas"
8 person.name = "Greg";
9 alert(person.name);        //"Nicholas"

writable设置为false,name属性的值不可修改。

注意:一旦把属性定义为不可配置的,就不能再把它变回可配置了。即把configurable设置为false,此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。

 

2、访问器属性:(4个)

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。

[[Enumerable]]:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true。

[[Get]]:在读取属性时调用的函数。默认值为undefined。

[[Set]]:在写入属性时调用的函数。默认值为undefined。

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

exp:

 1 var book = {
 2     _year:2004,
 3     edition:1
 4 };
 5 
 6 Object,defineProperty(book,"year",{
 7         get:function(){
 8             return this._year;
 9         },
10         set:function(newValue){
11             if(newValue > 2004){
12                     this._year = newValue;
13                     this.edition += newValue - 2004;
14             }
15         }
16 });
17 
18 book.year = 2005;
19 alert(book.edition);    //2
定义多个属性:

Object.defineProperties()方法。这是方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

exp:


var book = {};

Object.defineProperties(book,{
        _year:{
            writable:true,
            value:2004
        },
        
        edition:{
            writable:true,
            value:1
        },

        year:{
            get:function(){
                return this._year;
            },

            set:function(newValue){
                if(newValue > 2004){
                    this._year = newValue;
                    this.edition += newValue - 2004;
                }
            }
        }
});
 
读取属性的特性:

Obeject.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有configurable、enumerable、get和set;如果是数据属性,这个对象的属性有configurable、enumerable、writable和value。

exp:

 1 var book = {};
 2 
 3 Object.defineProperties(book,{
 4         _year:{
 5             writable:true,
 6             value:2004
 7         },
 8         
 9         edition:{
10             writable:true,
11             value:1
12         },
13 
14         year:{
15             get:function(){
16                 return this._year;
17             },
18 
19             set:function(newValue){
20                 if(newValue > 2004){
21                     this._year = newValue;
22                     this.edition += newValue - 2004;
23                 }
24             }
25         }
26 });
27 
28 var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
29 alert(descriptor.value);        //2004
30 alert(descriptor.configurable);    //false
31 alert(typeof descriptor.get);    //"undefined"
32 
33 var descriptor = Object.getOwnPropertyDescriptor(book,"year");
34 alert(descriptor.value);        //undefined
35 alert(descriptor.enumerable);        //false
36 alert(typeof descriptor.get);     //"function"
posted @ 2016-04-23 14:40  Yvette1014  阅读(145)  评论(0编辑  收藏  举报