一、要点

    

    ECMAScript中没有类的概念,对象的定义为:无序属性的集合,其属性可以包含基本值、对象、或者函数。

    

    创建对象的方法:var aOject = new Object();

    然后为对象添加属性和方法:aObject.aPorperty = something;

                 aObject.aMethod = something;

                 ...

    创建对象的字面量语法:  var aObject = {aProperty : something;

                           aMthod : function(){

                            something...}

                           ....}

    

    对象的属性——数据属性和访问器属性

    

    数据属性:包含一个确定的值的属性,我们所接触的属性大多数是数据属性

    数据属性的特征(attribute):


    1、congfigurable:能否通过Delete删除并重定义(默认为Ture)

    2、Enumerable:能否通过for-in循环

    3、writable:能否修改(默认为True)

    4、value:属性的值


    attribute一般是不可访问的,欲修改可使用object.defineProperty()方法

    object.denfineProperty()方法接受3个参数:属性所在的对象,属性名,和一个描述符对象


    一个描述符对象:{attribute : "attribute's value"}

    可以多次使用object.defineProperty()修改特征值,但是当把configurable设置为false后,无法再修改为True。

    

    访问器属性:访问器属性不包含数据值,它包含一对getter和setter函数(非必需)

    访问器属性不能直接定义,必需使用object,defineProperty()方法定义

    访问器属性使用其自带的get函数读取一个数值,使用set函数将属性写入

    典型的应用:设置一个值导致另一个值发生变化   

    访问器属性的attribute:

    1、configurable

    2、Enumerable

    3、Get:读取属性时调用的函数

    4、Set:写入属时调用的函数

    


    定义多个属性:object.defineProperties()方法

    两个参数:1、要添加或修改属性的对象

          2、一个属性与参数一的对象中要添加的属性一一对应的对象

    


    读取对象的特性:object.getOwnPropertyDescriptor()方法

    2个参数:1、对象

         2、所要描述的属性名称

    返回一个对象,对象的属性为attribute




    二、示例

    使用字面量语法创建一个对象

    var aObject = { 
            name : "wan",
            age : 23,
            gradute : False; //数据属性,每个属性都有一个数值
            }

    下面为aObject对象添加一个访问器属性


 object.defoineProperty(aObject,"newAge",{     //使用定义属性的方法定义一个访问器属性
    get : function(){           //传入3个参数第三个参数是一个描述符对象
        return this.age;        //描述符对象:包含属性为attribute的对象
        },                //访问器属性的get特性函数传入age
    set : function(gradute){
        if(gradute)            //set特性函数
       {
        age+=1;
        }              /*访问器属性的一大应用,
    }                  对象的某个属性发生变化时, 
   });                 其它属性随之变化*/

    


    定义多个属性

    

    var aObject = {};
    Object.defineProperties(aObject,{
            name:{value : "wan"},
            age:{value : 23},
            graduate:{value : False},
            newAge:{
                get : function(){
                    return this.age;
                },
                set : function(){
                    if(graduate){
                        this.age += 1;
                    }
                }
             }
     });

    这里定义了一个和之前的aObject对象相同的对象,只不过这里的属性是同时创建的



    读取属性的特性:

    var descriptor = Object.getOwnPropertyDescriptor(aObject,"name");

    以上代码返回一个对象,变量descriptor成为该对象的指针

    descriptor.value    //对象aObject的name属性的value特性

    descriptor.configurable  //对象aObject的name属性的configurable特性




    三、总结

    有两种创建对象的方法,我们一般是用字面量发创建一个对象

      对象有两种属性,分别为数据属性和访问器属性,我们一般使用的是数据属性

      属性拥有特性(attribute),描述了属性的一些特征,我们一般无法访问这些特性

        我们可以使用Object.getOwnPropertyDescriptor()方法来读取这些特性

      定义属性可以使用Object.defineProperty()方法,定义数据属性只需直接声明,

      而定义访问器属性必需使用此方法,与直接声明的区别在于,此方法还可以设置属性的

      特性(attribute),此方法有助于帮助我们理解属性的本质

        可以使用Object.defineProperties()方法来同时定义多个属性